PHP: MySQL-Datensätze verwalten
Auf dieser Seite wird beschrieben, wie man einen neuen Datensatz anlegt, bearbeitet, kopiert und gegebenenfalls wieder löscht. Außerdem wird beschrieben, wie verschiedene Arten von Datenbankabfragen durchgeführt werden.
Datensatz erzeugen
► MySQL-Dokumentation: INSERT
► PHP-Dokumentation: mysqli_insert_id()
Eine Datenbanktabelle kann über ein Formular einer Weboberfläche mit Daten befüllt werden. Ist eine Anzahl von Datensätzen bereits bei der Erzeugung der Datenbanktabelle bekannt, so können diese beispielsweise auch aus einem Array gelesen und in die Tabelle eingetragen werden:
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
$dbtname = "adressen";
$personen = [
["Hans", "Meier", "Hafenstraße", 34, 10001, "Musterstadt", "21.04.1987", "764534", ""],
["Monika", "Müller", "Am Acker", 3, 10002, "Musterdorf", "03.11.1956", "408564", ""],
["Paul", "Schmidt", "Bahnhofstraße", 129, 10001, "Musterstadt", "17.09.1972", "2856321", ""],
["Paula", "Lehmann", "Dorfstraße", 17, 10002, "Musterdorf", "11.06.1999", "9953421", ""]
];
foreach($personen as $person) {
$sql = "INSERT INTO `".$dbtname."` (
`vorname`, `nachname`, `strasse`, `hausnummer`, `plz`, `ort`, `geburtsdatum`, `telefon`, `kommentar`
) VALUES (
'".$person[0]."',
'".$person[1]."',
'".$person[2]."',
".$person[3].",
".$person[4].",
'".$person[5]."',
'".$person[6]."',
'".$person[7]."',
'".$person[8]."'
)";
if (mysqli_query($my, $sql)) echo "Datensatz #".mysqli_insert_id($my)." wurde angelegt.<br>";
else echo "<mark>Datensatz konnte nicht angelegt werden.</mark><br>Fehler: ".mysqli_error($my)."<br>";
}
?>
Mit dem Befehl INSERT wird nun ein neuer Eintrag in die Datenbank vorgenommen. Die Syntax ist dabei immer:
INSERT INTO tabellenname (spaltenname1, spaltenname2, …) VALUES ($variable1, $variable2, …)
In der Werteliste in der Klammer nach VALUES müssen alphanumerische Variablen in Anführungszeichen stehen, während bei Zahlenwerten keine Anführungszeichen verwendet werden müssen.
Ein Wert für die Spalte id wird nicht angegeben, da diese Spalte den Primärschlüssel trägt und durch das Attribut AUTO_INCREMENT der Wert automatisch eingetragen wird. Über die Funktion mysqli_insert_id() lässt sich dieser Wert ermitteln.
Daten auswählen und anzeigen
► MySQL-Dokumentation: SELECT
Um Datensätze aus einer Tabelle auszuwählen, wird der Befehl SELECT verwendet. Soll der gesamte Datensatz ausgewählt werden, wird dies durch das Sternchen * gekennzeichnet. Sollen nur einzelne Datenfelder gewählt werden, werden diese stattdessen durch Komma getrennt angegeben.
Beispiel: SELECT `vorname`, `nachname` FROM `adressen`
Das Ergebnis der Abfrage mysqli_query() enthält alle angeforderten Datensätze, die mit mysqli_fetch_assoc() in einer while-Schleife zeilenweise in das Array $ds eingelesen und dann als Tabelle wieder ausgeben werden.
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
function html($str) {
return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
}
$dbtname = "adressen";
$res = mysqli_query($my, "SELECT * FROM `".$dbtname."`");
if (mysqli_num_rows($res)) {
echo "<table><tr><th>ID</th><th>Vorname</th><th>Nachname</th><th>Straße</th><th>Hausnummer</th><th>PLZ</th><th>Ort</th><th>Geburtsdatum</th><th>Telefon</th><th>Kommentar</th></tr>";
while ($ds = mysqli_fetch_assoc($res)) {
echo "<tr>";
echo "<td>".html($ds['id'])."</td>";
echo "<td>".html($ds['vorname'])."</td>";
echo "<td>".html($ds['nachname'])."</td>";
echo "<td>".html($ds['strasse'])."</td>";
echo "<td>".html($ds['hausnummer'])."</td>";
echo "<td>".html($ds['plz'])."</td>";
echo "<td>".html($ds['ort'])."</td>";
echo "<td>".html($ds['geburtsdatum'])."</td>";
echo "<td>".html($ds['telefon'])."</td>";
echo "<td>".html($ds['kommentar'])."</td>";
echo "</tr>";
}
echo "</table>";
} else echo "<mark>Tabelle <samp>".$dbtname."</samp> enthält keine Datensätze.</mark>";
?>
Auswahl begrenzen
Will man nicht alle Datensätze der Tabelle erhalten, kann die Abfrage mit LIMIT begrenzt werden. Der erste Wert gibt die Startposition der Abfrage an, der zweite Wert die Anzahl der Datensätze. Im Beispiel werden 5 Datensätze beginnend mit dem 3. Datensatz ausgegeben, wobei der 3. Datensatz die Nummer 2 trägt, da mit der Zählung bei 0 begonnen wird. Diese Zahl ist nicht identisch mit dem Wert der Spalte id, da bei gelöschten Einträgen Datensätze fehlen werden.
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
function html($str) {
return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
}
$dbtname = "adressen";
$res = mysqli_query($my, "SELECT * FROM `".$dbtname."` LIMIT 2,5");
if (mysqli_num_rows($res)) {
echo "<table><tr><th>ID</th><th>Vorname</th><th>Nachname</th><th>Straße</th><th>Hausnummer</th><th>PLZ</th><th>Ort</th><th>Geburtsdatum</th><th>Telefon</th><th>Kommentar</th></tr>";
while ($ds = mysqli_fetch_assoc($res)) {
echo "<tr>";
echo "<td>".html($ds['id'])."</td>";
echo "<td>".html($ds['vorname'])."</td>";
echo "<td>".html($ds['nachname'])."</td>";
echo "<td>".html($ds['strasse'])."</td>";
echo "<td>".html($ds['hausnummer'])."</td>";
echo "<td>".html($ds['plz'])."</td>";
echo "<td>".html($ds['ort'])."</td>";
echo "<td>".html($ds['geburtsdatum'])."</td>";
echo "<td>".html($ds['telefon'])."</td>";
echo "<td>".html($ds['kommentar'])."</td>";
echo "</tr>";
}
echo "</table>";
} else echo "<mark>Tabelle <samp>".$dbtname."</samp> enthält keine Datensätze.</mark>";
?>
Liste sortieren
Möchte man die Liste nach bestimmten Kriterien sortieren, wird der Befehl um ORDER BY ergänzt, mit Angabe der gewünschten Spalte, nach der sortiert werden soll (hier: nachname). Die Schlüsselworte ASC (ascending) oder DESC (descending) geben die Sortierrichtung an.
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
function html($str) {
return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
}
$dbtname = "adressen";
$res = mysqli_query($my, "SELECT * FROM `".$dbtname."` ORDER BY `nachname` ASC LIMIT 2,5");
if (mysqli_num_rows($res)) {
echo "<table><tr><th>ID</th><th>Vorname</th><th>Nachname</th><th>Straße</th><th>Hausnummer</th><th>PLZ</th><th>Ort</th><th>Geburtsdatum</th><th>Telefon</th><th>Kommentar</th></tr>";
while ($ds = mysqli_fetch_assoc($res)) {
echo "<tr>";
echo "<td>".html($ds['id'])."</td>";
echo "<td>".html($ds['vorname'])."</td>";
echo "<td>".html($ds['nachname'])."</td>";
echo "<td>".html($ds['strasse'])."</td>";
echo "<td>".html($ds['hausnummer'])."</td>";
echo "<td>".html($ds['plz'])."</td>";
echo "<td>".html($ds['ort'])."</td>";
echo "<td>".html($ds['geburtsdatum'])."</td>";
echo "<td>".html($ds['telefon'])."</td>";
echo "<td>".html($ds['kommentar'])."</td>";
echo "</tr>";
}
echo "</table>";
} else echo "<mark>Tabelle <samp>".$dbtname."</samp> enthält keine Datensätze.</mark>";
?>
Bestimmte Datensätze auswählen
Datensätze können auch nach Suchkriterien ausgewählt werden, die mit WHERE angegeben werden. Im Beispiel sollen alle Datensätze gesucht werden, bei denen die Spalte nachname den Wert Müller enthält.
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
function html($str) {
return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
}
$dbtname = "adressen";
$res = mysqli_query($my, "SELECT * FROM `".$dbtname."` WHERE `nachname` = 'Müller'");
if (mysqli_num_rows($res)) {
echo "<table><tr><th>ID</th><th>Vorname</th><th>Nachname</th><th>Straße</th><th>Hausnummer</th><th>PLZ</th><th>Ort</th><th>Geburtsdatum</th><th>Telefon</th><th>Kommentar</th></tr>";
while ($ds = mysqli_fetch_assoc($res)) {
echo "<tr>";
echo "<td>".html($ds['id'])."</td>";
echo "<td>".html($ds['vorname'])."</td>";
echo "<td>".html($ds['nachname'])."</td>";
echo "<td>".html($ds['strasse'])."</td>";
echo "<td>".html($ds['hausnummer'])."</td>";
echo "<td>".html($ds['plz'])."</td>";
echo "<td>".html($ds['ort'])."</td>";
echo "<td>".html($ds['geburtsdatum'])."</td>";
echo "<td>".html($ds['telefon'])."</td>";
echo "<td>".html($ds['kommentar'])."</td>";
echo "</tr>";
}
echo "</table>";
} else echo "<mark>Tabelle <samp>".$dbtname."</samp> enthält keine Datensätze.</mark>";
?>
Mit LIKE können Einträge gefunden werden, die das angegebene Suchkriterium enthalten. Der Platzhalter % steht dabei für eine beliebige Anzahl von Zeichen, der Platzhalter _ für eine genaue Anzahl von Zeichen.
Beispiele:
SELECT * FROM `adressen` WHERE `nachname` LIKE '%er' – findet Meier und Müller
SELECT * FROM `adressen` WHERE `vorname` LIKE 'pa%' – findet Paul und Paula
SELECT * FROM `adressen` WHERE `nachname` LIKE 'M__er' – findet Meier aber nicht Müller
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
function html($str) {
return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
}
$dbtname = "adressen";
$res = mysqli_query($my, "SELECT * FROM `".$dbtname."` WHERE `nachname` LIKE '%er'");
if (mysqli_num_rows($res)) {
echo "<table><tr><th>ID</th><th>Vorname</th><th>Nachname</th><th>Straße</th><th>Hausnummer</th><th>PLZ</th><th>Ort</th><th>Geburtsdatum</th><th>Telefon</th><th>Kommentar</th></tr>";
while ($ds = mysqli_fetch_assoc($res)) {
echo "<tr>";
echo "<td>".html($ds['id'])."</td>";
echo "<td>".html($ds['vorname'])."</td>";
echo "<td>".html($ds['nachname'])."</td>";
echo "<td>".html($ds['strasse'])."</td>";
echo "<td>".html($ds['hausnummer'])."</td>";
echo "<td>".html($ds['plz'])."</td>";
echo "<td>".html($ds['ort'])."</td>";
echo "<td>".html($ds['geburtsdatum'])."</td>";
echo "<td>".html($ds['telefon'])."</td>";
echo "<td>".html($ds['kommentar'])."</td>";
echo "</tr>";
}
echo "</table>";
} else echo "<mark>Tabelle <samp>".$dbtname."</samp> enthält keine Datensätze.</mark>";
?>
Datensatz bearbeiten
► MySQL-Dokumentation: UPDATE
Um Datensätze zu aktualisieren, wird der Befehl UPDATE verwendet.
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
$dbtname = "adressen";
$ds = 5;
$person = ["Uschi", "Schmidt", "Waldweg", 129, 10001, "Musterstadt", "12.05.1932", "65234", ""];
$sql = "UPDATE `".$dbtname."` SET
`vorname` = '".$person[0]."',
`nachname` = '".$person[1]."',
`strasse` = '".$person[2]."',
`hausnummer` = ".$person[3].",
`plz` = ".$person[4].",
`ort` = '".$person[5]."',
`geburtsdatum` = '".$person[6]."',
`telefon` = '".$person[7]."',
`kommentar` = '".$person[8]."'
WHERE id = '".$ds."'";
if (mysqli_query($my, $sql)) echo "Datensatz #".$ds." wurde aktualisiert.";
else echo "<mark>Datensatz #".$ds." konnte nicht aktualisiert werden.</mark><br>Fehler: ".mysqli_error($my)."<br>";
?>
Kopie eines Datensatzes erzeugen
► MySQL-Dokumentation: INSERT
Um einen Datensatz zu kopieren, wird der Befehl INSERT … SELECT verwendet.
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
$dbtname = "adressen";
$ds = 4;
$sql = "INSERT INTO `adressen` (`vorname`, `nachname`, `strasse`, `hausnummer`, `plz`, `ort`, `geburtsdatum`, `telefon`, `kommentar`)
SELECT `vorname`, `nachname`, `strasse`, `hausnummer`, `plz`, `ort`, `geburtsdatum`, `telefon`, `kommentar`
FROM `adressen` WHERE `id` = '".$ds."'";
if (mysqli_query($my, $sql)) echo "Datensatz #".$ds." wurde kopiert.";
else echo "<mark>Datensatz #".$ds." konnte nicht kopiert werden.</mark><br>Fehler: ".mysqli_error($my)."<br>";
?>
Datensatz löschen
► MySQL-Dokumentation: DELETE
Um Einträge zu löschen, wird der Befehl DELETE verwendet.
<?php
header("Content-Type: text/html; charset=utf-8");
require("db.inc.php");
$dbtname = "adressen";
$ds = 5;
$sql = "DELETE FROM `".$dbtname."` WHERE `id` = '".$ds."'";
if (mysqli_query($my, $sql)) echo "Datensatz #".$ds." wurde gelöscht.";
else echo "<mark>Datensatz #".$ds." konnte nicht gelöscht werden.</mark><br>Fehler: ".mysqli_error($my)."<br>";
?>