Bitte warten...

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:

Code kopieren
<?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.

Code kopieren
<?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.

Code kopieren
<?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.

Code kopieren
<?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.

Code kopieren
<?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

Code kopieren
<?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.

Code kopieren
<?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.

Code kopieren
<?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.

Code kopieren
<?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>";
?>