PHP Lektionen – Lektion 3.2 – Arbeiten mit der MySQL-Datenbank. Daten einfügen mit INSERT INTO. Daten abfragen mit SELECT.
In der letzten Lektion haben wir eine Tabelle für unsere Website erstellt. In dieser Lektion verbessern wir unsere Tabelle und beginnen mit der Arbeit an der Datenbank: Wir werden Daten darin einfügen und aus der Tabelle abrufen. Ich denke, es wird nichts Kompliziertes, also fangen wir an.
Zuerst schlage ich vor, unsere Tabelle messages
zu verbessern. Derzeit hat sie Felder für Daten, aber es fehlt noch ein Feld zur Nummerierung der Einträge. Wenn Sie die Drupal-Datenbank öffnen, gibt es in der Tabelle node
das Feld nid
, mit dem die Nodes nummeriert werden. Das sollten wir auch für unsere Tabelle messages
machen.
Öffnen wir phpMyAdmin (für Denwer z.B. http://localhost/tools/phpmyadmin) und bearbeiten die Tabelle. Fügen Sie eine neue Spalte am Anfang der Tabelle hinzu, wie im Bild gezeigt:
Wir nennen die Spalte mid (message id), der Datentyp ist INT (Ganzzahl) mit der Länge 11 Zeichen. Setzen Sie außerdem das Häkchen bei AUTO_INCREMENT, was bedeutet, dass die Werte automatisch hochgezählt werden. Außerdem setzen wir bei Index den Wert PRIMARY, das bedeutet, dass dies der Primärschlüssel der Tabelle ist.
Wenn Sie sich erinnern, hatten wir eine eigene Methode in der Klasse simpleCMS, um die Tabelle zu erstellen. Nun sollten wir diese Methode anpassen, damit sie auch das Feld mid
hinzufügt. Gehen Sie in die Tabelle messages und klicken Sie auf Export:
Sie gelangen auf die Exportseite der Tabelle. Der Export erzeugt SQL-Befehle zum Erstellen und Ändern der Tabelle. Wenn wir die Tabelle in phpMyAdmin ändern, können wir später den SQL-Befehl zum Erstellen kopieren, was sehr praktisch ist.
Lassen Sie auf der Exportseite alles voreingestellt und klicken Sie auf OK. PhpMyAdmin zeigt Ihnen den SQL-Code entweder direkt im Browser oder als Datei. Beides ist in Ordnung. Wir kopieren den folgenden Code:
Achten Sie auf die Backticks (`), die in phpMyAdmin verwendet werden. In PHP können wir einfache Anführungszeichen verwenden. Kopieren Sie den Text in unsere Methode buildDB()
:
public function buildDB(){ $sql = "CREATE TABLE IF NOT EXISTS 'messages' ( 'mid' int(11) NOT NULL AUTO_INCREMENT, 'title' varchar(150) DEFAULT NULL, 'bodytext' text, 'created' varchar(100) DEFAULT NULL, PRIMARY KEY ('mid') ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"; return mysql_query($sql); }
Jetzt testen wir, wie das funktioniert. Löschen Sie die Tabelle messages:
Bestätigen Sie die Löschung. Wenn wir nun index.php starten, wird die Methode buildDB()
ausgeführt und die Tabelle sollte neu erstellt werden.
public function buildDB(){ $sql = "CREATE TABLE Messages ( mid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(mid), title varchar(15), bodytext text, created int(11) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"; $result = mysql_query($sql); print_r($result); }
Wenn wir index.php ausführen, erscheint die Tabelle Messages wie zuvor.
Einfüge-Abfragen INSERT INTO
Die Datenbank ist erstellt, nun können wir unsere Methoden zum Schreiben und Ausgeben von Nachrichten mit der Datenbank realisieren. Beginnen wir mit dem Schreiben in die Datenbank. Öffnen Sie die Methode write()
, wir werden sie anpassen.
Das Einfügen in die Tabelle erfolgt mit dem Operator INSERT INTO, so:
public function write($p) { // Methode zum Schreiben einer Nachricht $sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')'; return mysql_query($sql); }
Schauen wir uns an, wie genau Werte eingefügt werden. Die SQL-Einfüge-Anweisung beginnt mit INSERT INTO, danach folgt der Tabellenname Messages. Danach geben wir die Spalten an, in die wir Werte einfügen wollen. Beachten Sie, dass wir mid
nicht angeben, weil MySQL diesen Wert automatisch setzt, da wir AUTO_INCREMENT aktiviert haben. Dann folgt der Operator VALUES, danach listen wir die Werte für jede Spalte in der Tabelle auf. Die Reihenfolge der Spalten und Werte muss übereinstimmen, genauso die Anzahl.
Wenn ein Wert ein String ist, verwenden wir Anführungszeichen. Dabei ist zu beachten, dass diese Anführungszeichen sich von denen unterscheiden müssen, mit denen die gesamte SQL-Anweisung eingeschlossen ist. Wenn Sie eine Variable in die SQL-Anweisung einfügen, umgeben Sie den SQL-Text mit einfachen Anführungszeichen und den Variablenwert mit doppelten, z.B.:
"'. $p["title"] . '"
Das ist die Reihenfolge: Doppeltes Anführungszeichen, einfaches, Punkt, Variable, Punkt, einfaches, doppeltes.
Ich denke, ein Beispiel reicht vorerst. Es werden noch mehr folgen, also machen Sie sich keine Sorgen, wenn es nicht sofort klar ist. Ersetzen Sie den Code der Methode write()
durch den oben genannten, um ein paar Einträge in der Tabelle zu erstellen.
Auswahl-Abfragen SELECT
Einige Einträge erstellt und in phpMyAdmin angeschaut:
Jetzt können wir diese Einträge mit der Methode display_public()
ausgeben, die wir ebenfalls anpassen. Für die Auswahl aus der Tabelle verwenden wir den Operator SELECT, beginnen wir mit einer einfachen Auswahl:
public function display_public() { // Methode zur Anzeige der Nachrichten $content = ''; $sql = 'SELECT * FROM Messages'; // Auswahl-Abfrage $result = mysql_query($sql); // Ergebnis der Abfrage speichern while($row = mysql_fetch_array($result)){ // Ergebnis mit mysql_fetch_array() verarbeiten print '<div class="post">'; // div umschließt Eintrag print '<span class="time">#' . $row['mid'] . ' vom ' . date('d-m-Y', $row['created']) . '</span><h2>' . $row['title'] . '</h2>'; // Zeit und Titel ausgeben print '<p>' . $row['bodytext'] . '</p>'; // Nachrichtentext ausgeben print '</div>'; // div schließen } $content .= '<p><a href="/index.php?admin=1">Nachricht hinzufügen</a></p>'; return $content; }
Ich habe die Methode display_public()
komplett ersetzt, nun werden alle Einträge aus der Datenbank ausgegeben. Schauen wir uns dieses Beispiel an: Die SELECT-Anweisung beginnt mit SELECT, danach das Sternchen (*), was bedeutet, dass wir alle Spalten jeder Zeile aus der Tabelle auswählen wollen. Wenn wir stattdessen so schreiben:
$sql = 'SELECT mid,title FROM Messages'; // Auswahl-Abfrage $result = mysql_query($sql);
bedeutet das, dass wir nur mid
und title
aus jeder Zeile auswählen, bodytext
und created
brauchen wir nicht.
Nach dem * folgt der Operator FROM, der angibt, aus welcher Tabelle ausgewählt wird.
Das Ergebnis der Funktion mysql_query() für die Auswahl sollte in einer Variablen gespeichert werden (bei uns $result
), weil wir diese Variable später mit der Funktion mysql_fetch_array verarbeiten müssen.
Stellen Sie sich vor, wir haben eine Auswahl-Anfrage mit 3 Einträgen gemacht. Die Funktion mysql_fetch_array gibt bei jedem Aufruf ein Array mit einer Zeile zurück. Beim ersten Aufruf das erste Array, beim zweiten das zweite usw. Wenn keine weiteren Zeilen mehr vorhanden sind, liefert die Funktion false
. Deshalb verwenden wir hier eine while-Schleife: Solange ein Wert vorhanden ist, führen wir Aktionen aus. So iterieren wir durch alle Einträge.
Das kann am Anfang schwer verständlich sein, aber mit der Zeit gewöhnt man sich an SQL-Abfragen. Es gibt nicht so viele Operatoren, daher merkt man sie schnell.
Auswahl-Abfragen mit Sortierung ORDER BY
Wir können auch die Sortierreihenfolge mit dem Operator ORDER BY festlegen, standardmäßig erfolgt die Sortierung aufsteigend, z.B.:
$sql = 'SELECT * FROM Messages ORDER BY mid';
So sortieren wir die Auswahl nach aufsteigendem mid
. Für eine absteigende Sortierung verwenden wir zusätzlich den Operator DESC:
$sql = 'SELECT * FROM Messages ORDER BY mid DESC';
Für aufsteigende Sortierung kann man auch explizit ASC verwenden:
$sql = 'SELECT * FROM Messages ORDER BY mid ASC';
Obwohl ASC standardmäßig verwendet wird.
Auswahl-Abfragen mit Bedingungen WHERE
Zusätzlich zur Sortierung kann man Abfragen mit Bedingungen filtern, mit dem Operator WHERE:
$sql = 'SELECT * FROM Messages WHERE mid<3 ORDER BY mid DESC';
So geben wir die ersten zwei Einträge aus (mit mid=1
und mid=2
), wenn sie in der Tabelle vorhanden sind. Man kann auch die Operatoren AND (und) und OR (oder) verwenden, um mehrere Bedingungen zu verknüpfen. Bei AND müssen beide Bedingungen erfüllt sein, bei OR reicht eine.
$limit_time = time() - 3600; // Zeit vor einer Stunde $sql = 'SELECT * FROM Messages WHERE mid<3 AND created>' . $limit_time . ' ORDER BY mid DESC'; // Auswahl-Abfrage
So fügen wir eine weitere Bedingung hinzu, dass der Eintrag nicht älter als eine Stunde ist. Ich denke, das reicht fürs Erste für Auswahl-Abfragen, also wechseln wir zur nächsten Lektion.