Zur Navigation

Daten aus dieser Datenbank art richtig abspeichern uns auslesen.

1 Tom12

Hallo,
ich habe dieses Datenbankformat genommen, da es meiner meinung nach übersichtlicher ist und einfacher zu verwalten. (WordPress nutzt dieses Format auch).

Allerdings kenne ich mich mit MySQL noch nicht so gut aus.

Wie lese ich hier einzelne Werte aus?

und wie speicher ich welche richtig ab?

CREATE TABLE `option` (
  `option_id` bigint(20) UNSIGNED NOT NULL,
  `option_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `option_value` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `option` (`option_id`, `option_name`, `option_value`) VALUES
(1, 'siteurl', ''),
(2, 'sitename', ''),
(3, 'sitedescription', ''),
(4, 'adminemail', ''),
(5, 'mindestalter', ''),
(6, 'country', ''),
(7, 'robots', ''),
(8, 'allowregister', ''),
(9, 'keywordsmain', ''),
(10, 'mainrole', ''),
(11, 'backenddesign', ''),
(12, 'frontenddesign', ''),
(13, 'maincolor', ''),
(14, 'mainfontcolor', ''),
(15, 'mainbackgroundcolor', ''),
(16, 'mainhovercolor', ''),
(17, 'font', ''),
(18, 'created', ''),
(19, 'author', ''),
(20, 'language', '')

09.04.2018 17:45

2 Jörg Kruse

Wie lese ich hier einzelne Werte aus?

SELECT option_value
FROM option
WHERE option_name = 'siteurl'

... wobei ich aber eher einmalig die ganze Tabelle abfragen würde:

SELECT option_value
FROM option

... und die Ergebnistabelle dann in einem Array speichern. So hat man nur eine einzelne Abfrage ganz am Anfang und kann die einzelnen Konfigurationswerte dann aus dem Array beziehen.

und wie speicher ich welche richtig ab?

UPDATE option
SET option_value = 'http://example.com/',
updated_time = CURRENT_TIMESTAMP()
WHERE option_name = 'siteurl'

09.04.2018 20:39 | geändert: 09.04.2018 20:45

3 Tom12

Danke ;)
Was muss ich denn jetzt genau in PHP eintippen?

am besten wäre MySQLi aber PDO würde auch gehen
Was ist besser und was muss ich da eintippen
Bin halt noch n MySQL anfänger :D

09.04.2018 21:11

4 Tom12


und wie speicher ich welche richtig ab?

UPDATE option
SET option_value = 'http://example.com/',
updated_time = CURRENT_TIMESTAMP()
WHERE option_name = 'siteurl'

Danke ;-)
Wie mach ich dass, dass man alle Werte gleichzeitig ändern kann?
(ungerne mit einem array)

09.04.2018 21:14

5 Jörg Kruse

Beispiel mit mysqli (objektetorientierter Stil)

Zuerst Datenbankverbindung aufbauen (wie in Beispiel #1):

http://php.net/manual/de/mysqli.construct.php

Dann gesamte Tabelle `option` abfragen, und das Ergebnis mit mysqli::fetch-assoc in einer while Schleife in ein Array speichern:

$result = $mysqli->query("SELECT option_name, option_value FROM option");
options = [];
while ($row = $result->fetch_assoc()) {
    $options[$row['option_name']] = $row['option_value'];
}

einzelne Werte können dann so ausgegeben / verwendet werden:

echo $options['siteurl'];

Für die Updates der Werte kann ein prepared Statement verwendet werden, welches mehrmals ausgeführt wird:

$stmt = $mysqli->prepare(
    "UPDATE option
    SET option_value = ?,
    updated_time = CURRENT_TIMESTAMP()
    WHERE option_name = ?"
);
$stmt->bind_param("ss", $value, $name);

$name = 'siteurl';
$value = 'http://example.com/';
$stmt->execute();

$name = 'sitename';
$value = 'Name der Website';
$stmt->execute();

// ... und so weiter...

$stmt->close();

Allgemeines zu den Prepared Statements in MySQLi siehe auch im PHP-Manual, insbesondere Beispiel #3:

http://php.net/manual/de/mysqli.quickstart.prepared-statements.php

09.04.2018 22:12 | geändert: 09.04.2018 22:24

1 Forenmitglied fand diesen Beitrag gut

6 Tom12

Oke

Das sieht schonmal gut aus!

und wie speicher ich das ganze ab wenn ich dieses eine Fromular habe?:

	<form action="?save=settings" method="post">
		<label for="inputSiteurl">Website URL: 
			<input type="url" id="inputSiteurl" name="siteurl" value="<?php echo $siteurl; ?>" required>
		</label><br>
		<label for="inputSitename">Website Name: 
			<input type="text" id="inputSitename" name="sitename" value="<?php echo $sitename; ?>" required>
		</label><br>
		<label for="inputSitedescription">Website Beschreibung: 
			<input type="text" id="inputSitedescription" name="sitedescription" value="<?php echo $sitedescription; ?>" max="255" required>
		</label><br>
		<label for="inputKeywordsmain">Hauptschlagwörter: 
			<input type="text" id="inputKeywordsmain" name="keywordsmain" value="<?php echo $keywordsmain; ?>" max="255" required>
		</label><br>
		<label for="inputAdminemail">Adminstrator E-Mail: 
			<input type="email" id="inputAdminemail" name="adminemail" value="<?php echo $adminemail; ?>" required>
		</label><br>
		<label for="inputCountry">Land: 
			<select id="inputCountry" name="country" required>
				<option <?php echo $country_germany_select ?> value="germany">Deutschland</option>
				<option <?php echo $country_austria_select ?> value="austria">Österreich</option>
				<option <?php echo $country_switzerland_select ?> value="switzerland">Schweiz</option>
				<option <?php echo $country_luxembourg_select ?> value="luxembourg">Luxemburg</option>
				<option <?php echo $country_lichtenstein_select ?> value="lichtenstein">Lichtenstein</option>
				<option <?php echo $country_unitedstates_select ?> value="unitedstates">Vereinigte Staaten</option>
				<option <?php echo $country_unitedkingdom_select ?> value="unitedkingdom">Vereinigtes Königreich</option>
				<option <?php echo $country_canada_select ?> value="canada">Kanada</option>
				<option <?php echo $country_australia_select ?> value="australia">Australien</option>
				<option <?php echo $country_newzealand_select ?> value="newzealand">Neuseeland</option>
				<option <?php echo $country_ireland_select ?> value="ireland">Irland</option>
			</select>
		</label><br>
		<label for="inputLanguage">Sprache: 
			<select id="inputLanguage" name="language" required>
				<option <?php echo $language_german_select ?> value="german">Deutsch</option>
				<option <?php echo $language_english_select ?> value="english">Englisch</option>
			</select>
		</label><br>
		<label for="inputRobots">Suchmaschienen Indexierung: 
			<select id="inputRobots" name="robots" required>
				<option <?php echo $robots_0_select; ?> value="0" selected>In Suchmaschienen nicht Indexieren</option>
				<option <?php echo $robots_1_select; ?> value="1">In Suchmaschienen Indexieren</option>
			</select>
		</label><br>
		<label for="inputAllowregister">Registrierung im Frontend
			<select for="inputAllowregister" name="allowregister" required>
				<option <?php echo $allowregister_0_select; ?> value="0">Registrieren nicht erlauben</option>
				<option <?php echo $allowregister_1_select; ?> value="1">Registrieren erlauben</option>
			</select>
		</label><br>
		
		<label for="inputBackenddesign">Backend Design: 
			<select id="inputBackenddesign" name="backenddesign" required>
				<?php
					$verzeichnis_design = "../backend/design/";
					if ( is_dir ( $verzeichnis_design )) {
						if ( $handle_design = opendir($verzeichnis_design) ) {
							while (($file_design = readdir($handle_design)) !== false) {
								if ($file_design !== '.' and $file_design !== '..') {
				?>
									<option <?php if($backenddesign == $file_design){ echo 'selected'; } ?> value="<?php echo $file_design; ?>"><?php echo $file_design; ?></option>
				<?php
								}
							}
							closedir($handle_design);
						}
					}
				?>
			</select>
		</label><br>
		
		<label for="inputFrontenddesign">Frontend Design: 
			<select id="inputFrontenddesign" name="frontenddesign" required>
				<?php
					$verzeichnis_frontenddesign = "../website/design/";
					if ( is_dir ( $verzeichnis_frontenddesign )) {
						if ( $handle_frontenddesign = opendir($verzeichnis_frontenddesign) ) {
							while (($file_frontenddesign = readdir($handle_frontenddesign)) !== false) {
								if ($file_frontenddesign !== '.' and $file_frontenddesign !== '..') {
				?>
									<option <?php if($frontenddesign == $file_frontenddesign){ echo 'selected'; } ?> value="<?php echo $file_frontenddesign; ?>"><?php echo $file_frontenddesign; ?></option>
				<?php
								}
							}
							closedir($handle_frontenddesign);
						}
					}
				?>
			</select>
		</label><br>
		
		<label for="inputFont">Schriftart: 
			<select id="inputFont" name="font" required>
				<?php
					$verzeichnis_font = "../include/fonts/";
					if ( is_dir ( $verzeichnis_font )) {
						if ( $handle_font = opendir($verzeichnis_font) ) {
							while (($file_font = readdir($handle_font)) !== false) {
								if ($file_font !== '.' and $file_font !== '..') {
				?>
									<option <?php if($font == $file_font){ echo 'selected'; } else { $nofont = 'selected'; } ?> value="<?php echo $file_font; ?>"><?php echo $file_font; ?></option>
				<?php
								}
							}
							closedir($handle_font);
						}
					}
				?>
				<option <?php echo $nofont; ?> value="none">Keine Schriftart</option>
			</select>
		</label><br>

		<label for="inputMaincolor">Hauptfarbe: 
			<input type="color" id="inputMaincolor" name="maincolor" value="<?php echo $maincolor; ?>" required>
		</label><br>
		
		<label for="inputMainfontcolor">Haupt Schriftfarbe: 
			<input type="color" id="inputMainfontcolor" name="mainfontcolor" value="<?php echo $mainfontcolor; ?>" required>
		</label><br>
		
		<label for="inputMainbackgroundcolor">Haupt Hintergrundfarbe: 
			<input type="color" id="inputMainbackgroundcolor" name="mainbackgroundcolor" value="<?php echo $mainbackgroundcolor; ?>" required>
		</label><br>
		
		<label for="inputMainhovercolor">Haupt hover Farbe: 
			<input type="color" id="inputMainhovercolor" name="mainhovercolor" value="<?php echo $mainhovercolor; ?>" required>
		</label><br>

		<label for="inputAuthor">Author Name/Copyright: 
			<input type="text" id="inputAuthor" name="author" value="<?php echo $author; ?>" required>
		</label><br>
		
		<lable for="inputMindestalter">Mindestalter: 
			<input type="number" id="inputMindestalter" name="mindestalter" value="<?php echo $mindestalter; ?>" required>
		</lable>
		
		<label for="inputMainrole">Standartrolle: 
			<select id="inputMainrole" name="mainrole" required>
				<option <?php echo $mainrole_user_select; ?> value="user">Benutzer</option>
				<option <?php echo $mainrole_member_select; ?> value="member">Mitglied</option>
				<?php if($user['role'] === 'adminstrator' || $setup == true) { ?>
					<option <?php echo $mainrole_supporter_select; ?> value="supporter">Supporter</option>
				<?php } ?>				
			</select>
		</label><br>
		
		<button type="submit">Speichern</button>
	</form><br>

also wenn ich alle Daten gleichzeitig abspeichern möchte. (nicht einzeln)

10.04.2018 14:24

7 Tom12

Wenn ich das hier so eingebe:

<?php
	$success_msg = false;
	if(isset($_GET['save'])) {
		$save = $_GET['save'];
		if($save == 'settings') {
			$siteurl = $_POST['siteurl'];
			$sitename = $_POST['sitename'];
			$sitedescription = $_POST['sitedescription'];
			$keywordsmain = $_POST['keywordsmain'];
			$adminemail = $_POST['adminemail'];
			$country = $_POST['country'];
			$robots = $_POST['robots'];
			$allowregister = $_POST['allowregister'];
			$author = $_POST['author'];
			$mainrole = $_POST['mainrole'];
			$backenddesign = $_POST['backenddesign'];
			$frontenddesign = $_POST['frontenddesign'];
			$maincolor = $_POST['maincolor'];
			$mainfontcolor = $_POST['mainfontcolor'];
			$mainbackgroundcolor = $_POST['mainbackgroundcolor'];
			$mainhovercolor = $_POST['mainhovercolor'];
			$font = $_POST['font'];
			$mindestalter = $_POST['mindestalter'];
			$language = $_POST['language'];
			if (!$created) {
				$created = date('Y-m-d');
			} else {
				$created = $created;
			}
		}
		if($siteurl == '' || $sitename == '' || $sitedescription == '' || $keywordsmain == '' || $adminemail == '' || $country == '' || $robots == '' || $allowregister == '' || $author == '' || $mainrole == '' || $backenddesign == '' || $frontenddesign = '' || $maincolor == '' || $mainfontcolor == '' || $mainbackgroundcolor == '' || $mainhovercolor == '' || $font == '' || $mindestalter == '' || $language == '' || $created == '') {
			$error_msg = 'Bitte alle Felder ausfüllen<br>';
			$error = true;
		}
		//URL muss noch getrimmt werden
		if(!filter_var($siteurl, FILTER_VALIDATE_URL)) {
			$error_msg = 'Bitte gebe einen gültigen URL an.<br>';
			$error = true;
		}
		$siteurl = trim($siteurl, '/');
		
		if(!filter_var($adminemail, FILTER_VALIDATE_EMAIL)) {
			$error_msg = 'Bitte eine gültige Administrator E-Mail-Adresse eingeben<br>';
			$error = true;
		}
		
		if (strlen ($sitedescription) > 255) {
			$error_msg = 'Die Webseiten beschreibung ist zu lang. Sie darf maximal 255 Zeichen entsprechen.';
		}
		//Speichert alles in der config Datei
		if (!$error) {
			$stmt = $db->prepare("UPDATE `option` SET `option_value` = ?, `updated_time` = CURRENT_TIMESTAMP() WHERE `option_name` = ?");
			$stmt->bind_param("ss", $value, $name);

			$name = 'siteurl';
			$value = $siteurl;
			$stmt->execute();

			$name = 'sitename';
			$value = $sitename;
			$stmt->execute();

			// ... und so weiter...

			$stmt->close();
			$success_msg = "Alle Felder wurden erfolgreich gespeichert.<br>";
		}
	}

bekomme ich diesen Error raus.

Fatal error: Call to a member function bind_param() on boolean in /var/www/vhosts/MEINSERVER/MEINEURL/include/backend/websitesettings.inc.php on line 53

Zeile 53 wäre dann diese:
$stmt->bind_param("ss", $value, $name);

Was hab ich falsch gemacht?

10.04.2018 14:58

8 Jörg Kruse

Ja, das Statement ist wohl schon verkehrt, es muss updated_at heißen, nicht updated_time (mein Fehler)

$stmt = $mysqli->prepare(
    "UPDATE option
    SET option_value = ?,
    updated_at = CURRENT_TIMESTAMP()
    WHERE option_name = ?"
);

Man kann sich hiernach auch eine etwaige Fehlermeldung ausgeben lassen:

if (!$stmt) {
    printf("Error: %s\n", $mysqli->error);
}

Normalerweise sollte das Array $options auch auf der Update-Seite zur Verfügung stehen (die Optionen benötigt man denke ich auf jeder Seite). Dann kann man in einer Schleife überprüfen, ob ein entsprechender Wert übertragen wurde und dieser sich geändert hat und ggf. updaten:

$stmt = $mysqli->prepare(
    "UPDATE option
    SET option_value = ?,
    updated_at = CURRENT_TIMESTAMP()
    WHERE option_name = ?"
);
$stmt->bind_param("ss", $value, $name);
foreach ($options as $name => $old_value) {
    if (isset($_POST[$name]) && $_POST[$name] != $old_value) {
        $value = $_POST['name'];
        $stmt->execute();
    }
}
$stmt->close();

10.04.2018 18:01

1 Forenmitglied fand diesen Beitrag gut

9 Tom12

Vielen Dank

Mega cool dass das ganze jetzt klappt

Ich denke durch deine Hilfe werden mir MySQL abfragen in Zukunft einfacher vorkommen :D

10.04.2018 21:14

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]