4 MYSQL-DATEN IM WEB PUBLIZIEREN
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
71 4 MySQL-Daten im Web publizieren Hier kommt er – der Teil, auf den Sie sicherlich schon lange gewartet haben! In diesem Kapitel lernen Sie nun, wie Sie Informationen aus einer Datenbank herausholen und für alle sichtbar auf einer Webseite anzeigen können. Bisher haben Sie das relationale Datenbanksystem MySQL sowie die serverseitige Skriptsprache PHP installiert und deren Grundlagen gelernt. Jetzt werden Sie sehen, wie diese beiden neuen Werkzeuge zusammenarbeiten, um eine echte datenbank- gestützte Website zu erschaffen! 4.1 Ein Blick zurück auf die grundlegenden Prinzipien Bevor wir den Sprung nach vorn wagen, werfen wir einen kurzen Blick zurück, was wir eigentlich mit dem Erlernten anfangen wollen. Wir kennen nun zwei mächtige, neue Werkzeuge, die wir selbst einsetzen können: die Skriptsprache PHP und das MySQL-Datenbanksystem. Es ist wichtig, zu verstehen, wie diese beiden zusammenpassen. Die ganze Idee einer datenbankgestützten Website besteht darin, dass der Inhalt der Site in einer Datenbank liegt. Dieser wird dyna- misch aus der Datenbank geholt, um daraus Webseiten zu erzeugen, Abb. 4–1 PHP vermittelt zwischen dem Webbrowser und der Datenbank
72 4 MySQL-Daten im Web publizieren die Leute mit einem normalen Webbrowser ansehen können. Auf der einen Seite des Systems haben Sie also einen Besucher Ihrer Website, der einen Webbrowser benutzt, um http://www.yoursite.com/ zu laden, und der davon ausgeht, eine Standard-HTML-Seite zu sehen. Am anderen Ende haben Sie den Inhalt Ihrer Website, der sich in einer oder mehreren Tabellen einer MySQL-Datenbank befindet, und diese Datenbank weiß lediglich, wie sie auf SQL-Anfragen oder -Befehle antworten muss. PHP spricht Wie in Abbildung 4–1 dargestellt vermittelt PHP zwischen beiden zwei Sprachen Anforderungen, denn es spricht beide Sprachen. PHP verarbeitet die Seitenanforderung, holt die Daten aus der MySQL-Datenbank und sendet sie dann als hübsch formatierte HTML-Seite an den Browser. Mit PHP können Sie die Präsentationsaspekte Ihrer Website (die nette Grafik und das Seitenlayout) als »Vorlagen« in normalem HTML schreiben. Wo der Inhalt in diesen Vorlagen hineingehört, benutzen Sie PHP-Code; um sich mit der MySQL-Datenbank zu verbinden und den Inhalt (mit SQL-Anfragen, siehe Kapitel 2) abzuholen und ihn an die- ser Stelle anzuzeigen. Ablauf einer Jetzt, nach dem Auffrischen dieses Sachverhalts, fassen wir zusam- Browseranfrage men, was passiert, wenn jemand eine Seite auf Ihrer datenbankgestütz- ten Website besucht: ■ Der Webbrowser des Besuchers fordert mit einer normalen URL eine Webseite an. ■ Die Webserver-Software (Apache, IIS oder was auch immer) erkennt, dass die angeforderte Datei ein PHP-Skript ist und inter- pretiert diese Datei mit dem PHP-Plug-in, bevor der Webserver auf die Seitenanforderung antwortet. ■ Bestimmte PHP-Befehle (die wir noch lernen müssen) verbinden sich mit der MySQL-Datenbank und rufen den Inhalt ab, der in die Webseite gehört. ■ Die MySQL-Datenbank antwortet, indem sie den angeforderten Inhalt an das PHP-Skript sendet. ■ Das PHP-Skript speichert den Inhalt in eine oder mehrere PHP- Variablen und benutzt dann die mittlerweile vertraute echo-Anwei- sung, um den Inhalt als Teil der Webseite auszugeben. ■ Das PHP-Plug-in beendet die Verarbeitung, indem es eine Kopie des erzeugten HTMLs an den Webserver schickt. ■ Der Webserver sendet das HTML an den Webbrowser, genau wie er das mit einer einfachen HTML-Datei machen würde, nur dass das HTML nicht direkt aus der Datei kommt, sondern die Ausgabe des PHP-Plug-ins ist.
4.2 Verbindung zu MySQL mit PHP 73 4.2 Verbindung zu MySQL mit PHP Bevor Sie Inhalte aus Ihrer MySQL-Datenbank zum Einfügen in eine mysql_connect() Webseite holen können, müssen Sie wissen, wie man eine Verbindung zu MySQL von einem PHP-Skript aufbaut. In Kapitel 2 »Mit MySQL anfangen« haben Sie dafür ein Programm namens mysql benutzt. PHP braucht dazu allerdings kein spezielles Programm, weil die Unterstüt- zung für Verbindungen zu MySQL direkt in die Sprache eingebaut ist. Folgender PHP-Funktionsaufruf stellt die Verbindung her: mysql_connect(adresse, benutzername, passwort); Hierbei ist adresse die IP-Adresse oder der Hostname des Computers, auf dem die MySQL-Serversoftware läuft ("localhost", wenn sie auf demselben Computer läuft wie die Webserver-Software). benutzername und passwort sind derselbe MySQL-Benutzername und dasselbe Pass- wort, die Sie benutzt haben, um sich in Kapitel 2 mit dem MySQL-Ser- ver zu verbinden. Vielleicht erinnern Sie sich, dass PHP-Funktionen üblicherweise Rückgabewert einen Wert zurückgeben, wenn sie aufgerufen werden. Keine Sorge, wenn es bei Ihnen nicht gleich klingelt – das ist ein Detail, das ich bei der Einführung in Funktionen nur am Rande erwähnt habe. Die meis- ten Funktionen machen irgendetwas Nützliches und geben zusätzlich einen Wert zurück, der für eine spätere Verwendung in einer Variablen gespeichert werden kann. Die oben gezeigte Funktion mysql_connect gibt zum Beispiel eine Zahl zurück, mit der die aufgebaute Verbindung identifiziert werden kann. Weil wir vorhaben, die Verbindung zu benutzen, sollten wir uns diesen Wert irgendwie merken. Folgendes Beispiel zeigt, wie wir uns mit dem MySQL-Server verbinden können: $dbcnx = mysql_connect(’localhost’, ’root’, ’meinpasswort’); Wie oben beschrieben können die Werte dieser drei Funktionspara- Verbindungskennung meter bei Ihrem MySQL-Server anders lauten. Wichtig für Sie ist hier, dass der Wert, den mysql_connect zurückgibt (den wir Verbindungs- kennung nennen werden), in einer Variablen namens $dbcnx gespei- chert wird. Weil der MySQL-Server ein völlig eigenständiges Programm ist, Fehlerbehandlung müssen wir die Möglichkeit berücksichtigen, dass der Server nicht ver- fügbar oder wegen eines Netzwerkausfalls nicht erreichbar ist oder dass die Kombination Benutzername/Passwort, die Sie angegeben haben, vom Server nicht akzeptiert wird. In solchen Fällen gibt die Funktion mysql_connect keine Verbindungskennung zurück (weil keine Verbin- dung aufgebaut wurde). Stattdessen gibt sie UNWAHR zurück. Das gestattet uns, auf solche Fehlschläge mit einer if-Abfrage zu reagieren:
74 4 MySQL-Daten im Web publizieren $dbcnx = @mysql_connect('localhost', 'root', 'meinpasswort'); if (!$dbcnx) { echo 'Verbindungsaufbau zum Datenbankserver ' . ' zurzeit nicht möglich.' ); exit(); } Es gibt in diesem Codefragment drei neue Tricks: Trick 1: ■ Zuerst haben wir ein @-Zeichen vor die Funktion mysql_connect @ vor mysql_connect() geschrieben. Viele Funktionen, darunter mysql_connect, geben automatisch hässliche Fehlermeldungen aus, wenn sie fehlschlagen. Indem wir ein @-Zeichen (auch bekannt als Operator zur Unter- drückung von Fehlermeldungen) vor den Namen setzen, weisen wir die Funktion an, diese Meldungen zu unterlassen, so dass wir unsere eigene, freundlichere Fehlermeldung ausgeben können. Trick 2: ■ Dann haben wir vor die Variable $dbcnx in der Bedingung des if- ! vor $dbcnx Statements ein Ausrufungszeichen gesetzt. Das Ausrufungszeichen ist in PHP der Negationsoperator, der im Prinzip einen unwahren Wert zu WAHR macht oder umgekehrt. Wenn daher die Verbindung fehlschlägt und mysql_connect UNWAHR zurückgibt, wird !$dbcnx zu WAHR ausgewertet und sorgt dafür, dass die Statements im Anwei- sungsblock unseres if-Statements ausgeführt werden. Wenn dage- gen eine Verbindung hergestellt wurde, wird die Verbindungsken- nung, die in der Variablen $dbcnx gespeichert ist, zu WAHR ausgewertet (jede Zahl außer null wird in PHP als »WAHR« betrach- tet), daher wird !$dbcnx zu UNWAHR ausgewertet, und die Befehle im if-Statement werden nicht ausgeführt. Trick 3: ■ Der letzte neue Trick ist die Funktion exit, die unser erstes Beispiel exit einer Funktion ist, die keine Parameter entgegennimmt. Alles, was diese Funktion macht, ist PHP zu veranlassen, ab diesem Punkt mit dem Lesen der Seite aufzuhören. Das ist eine gute Antwort auf eine fehlgeschlagene Datenbankverbindung, denn in den meisten Fällen wird die Seite dann nicht in der Lage sein, irgendeine nützliche Information auszugeben. Datenbank auswählen Wie in Kapitel 2 besteht der nächste Schritt nach dem Aufbau einer mit mysql_select_db() Verbindung darin, die Datenbank auszuwählen, mit der Sie arbeiten wollen. Nehmen wir an, wir wollen mit der Witzedatenbank arbeiten, die wir dort bereits erzeugt haben. Die erzeugte Datenbank nannten wir jokes. Diese Datenbank in PHP auszuwählen ist lediglich eine Sache eines weiteren Funktionsaufrufs: mysql_select_db(’jokes’, $dbcnx);
4.3 SQL-Anfragen mit PHP abschicken 75 Wie Sie sehen, verwenden wir die Variable $dbcnx, die die Datenbank- Verbindungskennung enthält, um der Funktion mitzuteilen, welche Datenbankverbindung benutzt werden soll. Dieser Parameter ist in der Tat optional. Wenn er weggelassen wird, benutzt die Funktion auto- matisch die Verbindungskennung der zuletzt aufgebauten Verbindung. Die Funktion gibt WAHR zurück, wenn sie erfolgreich ausgeführt wurde, und UNWAHR, wenn ein Fehler auftritt. Wieder einmal ist es klug, ein if- Statement zu verwenden, um Fehlerfälle abzuhandeln: if (!@mysql_select_db('jokes')) { exit('Auswahl der Witzedatenbank' . 'zurzeit nicht möglich.'); Diesmal habe ich einfach den Funktionsaufruf selbst als Bedingung Funktionsaufruf als verwendet, statt den Rückgabewert der Funktion in eine Variable zu Bedingung verwenden speichern und dann zu prüfen, ob die Variable wahr oder unwahr ist. Das sieht vielleicht etwas merkwürdig aus, ist aber eine sehr gebräuch- liche Abkürzung. Um festzustellen, ob die Bedingung wahr ist oder falsch, führt PHP die Funktion aus und prüft dann ihren Rückgabe- wert – somit passiert genau das, was wir wollen. Noch eine andere Kurzform habe ich hier benutzt: ich habe exit mit einem String als Parameter aufgerufen. Damit arbeitet exit genau wie echo, allerdings wird das Skript beendet, sobald die Meldung aus- gegeben wurde. Wenn man also exit auf diese Weise aufruft, hat das dieselbe Wirkung wie ein Aufruf von echo, gefolgt von einem exit ohne Parameter, so wie wir das oben beim mysql_connect gemacht haben. Jetzt, wo wir die Verbindung aufgebaut und eine Datenbank aus- gewählt haben, sind wir bereit, die Daten zu nutzen, die in unserer Datenbank gespeichert sind. 4.3 SQL-Anfragen mit PHP abschicken In Kapitel 2 haben wir mit einem Programm namens mysql die Verbin- mysql_query() dung zum MySQL-Datenbankserver aufgenommen. mysql erlaubte uns, SQL-Anfragen (Queries oder Befehle) einzugeben und die Ergeb- nisse direkt zu betrachten. In PHP gibt es ähnliche Mechanismen: die Funktion mysql_query. mysql_query(anfrage, verbindungskennung); Hierbei ist anfrage eine Zeichenkette, die die SQL-Befehle enthält, die wir ausführen wollen. Wie bei mysql_select_db ist der Parameter für verbindungskennung optional. Was die Funktion zurückgibt, hängt von der Art der Anfrage ab, die losgeschickt wurde. Bei den meisten SQL-
76 4 MySQL-Daten im Web publizieren Befehlen gibt mysql_query entweder WAHR oder UNWAHR zurück, um Erfolg bzw. Misserfolg der Anfrage anzuzeigen. Betrachten Sie folgen- des Beispiel, in dem versucht wird, die Tabelle Jokes aus Kapitel 2 anzulegen: $sql = 'CREATE TABLE Jokes ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, JokeText TEXT, JokeDate DATE NOT NULL )'; if (@mysql_query($sql)) { echo 'Witzetabelle erfolgreich erzeugt!'; } else { exit('Fehler beim Anlegen der Witzetabelle: ' . mysql_error() . ''); } Auch hier benutzen wir wieder den @-Trick, um irgendwelche Fehler- meldungen zu unterdrücken, die von mysql_query ausgegeben werden, und geben stattdessen eine eigene, freundlichere Fehlermeldung aus. Die Funktion mysql_error, die hier benutzt wird, gibt einen Text zurück, der die letzte Fehlermeldung beschreibt, die vom MySQL- Server geschickt wurde. Bei den Anfragen DELETE, INSERT und UPDATE (die dazu dienen, gespeicherte Daten zu verändern) kümmert sich MySQL zusätzlich um die Anzahl von Tabellenzeilen (Einträgen), die durch die Anfrage betroffen wurden. Sehen Sie sich folgenden SQL-Befehl an, den wir in Kapitel 2 benutzt haben, um die Datumsangaben aller Witze zu setzen, die das Wort »Huhn« enthalten: $sql = "UPDATE Jokes SET JokeDate='1994-04-01' WHERE JokeText LIKE '%huhn%'"; Betroffene Zeilen zählen Wenn wir diese Anfrage ausführen, können wir die Funktion mit mysql_affected_rows() mysql_affected_rows (engl.: affected rows = betroffene Zeilen) benut- zen, um die Anzahl von Zeilen zu erfahren, die durch diese Aktualisie- rung betroffen wurden: if ( @mysql_query($sql) ) { echo("Die Aktualisierung betraf " . mysql_affected_rows() . " Zeilen . "); } else { echo("Fehler bei der Ausführung der Aktualisierung: " . mysql_error() . ""); }
4.4 SELECT-Ergebnisse verarbeiten 77 SELECT-Anfragen werden etwas anders behandelt, weil sie viele Zeilen abrufen könnten. Daher muss PHP Möglichkeiten zur Verfügung stellen, um mit solchen Informationen umzugehen. 4.4 SELECT-Ergebnisse verarbeiten Bei den meisten SQL-Anfragen gibt die Funktion mysql_query entwe- Ergebnismenge ... der WAHR (Erfolg) oder UNWAHR (Misserfolg) zurück. Bei SELECT-Anfragen reicht das nicht aus. Sie erinnern sich, dass SELECT-Anfragen benutzt werden, um Daten anzusehen, die in der Datenbank gespeichert sind. Zusätzlich zur Anzeige, ob die Anfrage erfolgreich war oder fehl- schlug, muss PHP auch die Ergebnisse der Anfrage empfangen. Daher gibt mysql_query, wenn es eine SELECT-Anfrage verarbeitet, zusätzlich einen Wert zurück. Dieser Wert stellt eine »Ergebnismenge« (result set) dar, die eine Liste aller Zeilen (Einträge) aus der Anfrage enthält. UNWAHR wird immer dann zurückgegeben, wenn die Anfrage aus irgendeinem Grund fehlschlägt. $result = @mysql_query(’SELECT JokeText FROM Jokes’); if (!$result) { echo(’Fehler bei der Ausführung der Abfrage: ’ . mysql_error() . ’’); exit(); } Vorausgesetzt, dass bei der Verarbeitung der Anfrage kein Fehler auf- ... in der Variablen $result tritt, gibt der obige Code eine Ergebnismenge in der Variablen $result zurück. Sie enthält den Text aller Witze, die in der Witzetabelle gespei- chert sind. Da es praktisch keine Begrenzung hinsichtlich der Zahl der Witze in der Datenbank gibt, kann die Ergebnismenge ziemlich groß sein. Ich habe bereits erwähnt, dass die while-Schleife eine sehr nützli- Ergebniszeilen che Kontrollstruktur für den Umgang mit großen Datenmengen ist. nacheinander abarbeiten Mit ihrer Hilfe lassen sich die Zeilen einer Ergebnismenge nacheinan- mit mysql_fetch_array() der verarbeiten: while ( $row = mysql_fetch_array($result) ) { // Zeile verarbeiten ... } Die Bedingung für die while-Schleife ähnelt wahrscheinlich nicht allzu sehr Bedingungen, an die Sie gewöhnt sind, daher will ich erklären, wie sie funktioniert. Betrachten Sie die Bedingung als ein einzelnes Statement:
78 4 MySQL-Daten im Web publizieren $row = mysql_fetch_array($result); Die Funktion mysql_fetch_array nimmt als Parameter eine Ergebnis- menge entgegen (in diesem Fall gespeichert in der Variablen $result) und gibt die jeweils nächste Zeile als Array zurück (Arrays wurden im Kapitel 3 besprochen). Wenn es in der Ergebnismenge keine weiteren Zeilen gibt, gibt mysql_fetch_array stattdessen UNWAHR zurück. Das obige Statement weist nun der Variablen $row einen Wert zu, aber zugleich nimmt auch das gesamte Statement denselben Wert an. Das ist der Grund, warum wir das Statement als Bedingung für unsere while-Schleife verwenden können. Da while-Schleifen genau so lange durchlaufen werden, bis ihre Bedingung UNWAHR wird, läuft die Schleife so lange, wie es Zeilen in der Ergebnismenge gibt; dabei nimmt $row jedes Mal den Wert der nächsten Zeile an, wenn die Schleife erneut durchlaufen wird. Alles, was jetzt noch getan werden muss, ist, die Werte aus der Variablen $row bei jedem Schleifendurchlauf herauszu- bekommen. Arrays Zeilen einer Ergebnismenge werden als assoziative Arrays darge- stellt. Die Indizes dieses Arrays entsprechen den Spaltennamen der Ergebnismenge. Wenn $row eine Zeile unserer Ergebnismenge enthält, dann enthält $row[’JokeText’] den Wert der Spalte JokeText dieser Zeile. Und so sollte unsere while-Schleife aussehen, wenn wir den Text aller Witze in unserer Datenbank ausgeben wollen: while ($row = mysql_fetch_array($result)) { echo '' . $row['JokeText'] . ''; } Zusammenfassend folgt hier das komplette Skript einer PHP-Web- seite, die sich mit unserer Datenbank verbindet, den Text aller Witze aus der Datenbank holt und sie in HTML-Absätzen anzeigt. Listing Unsere Liste mit Witzen
4.4 SELECT-Ergebnisse verarbeiten 79 // Verbindung zum Datenbankserver $dbcnx = @mysql_connect('localhost', 'root', 'meinpasswort'); if (!$dbcnx) { exit('Verbindungsaufbau zum Datenbankserver ' . ' zurzeit nicht möglich.'); } // Datenbank auswählen if (!@mysql_select_db('jokes')) { exit('Auswahl der Witzedatenbank' . 'zurzeit nicht möglich.'); } ?> Hier sind alle Witze in unserer Datenbank: Die Abbildung 4–2 zeigt, wie diese Seite aussieht, nachdem Sie ein paar Witze in die Datenbank eingefügt haben: Abb. 4–2 Meine gesammelten Kostbarkeiten – an einem zentralen Platz
80 4 MySQL-Daten im Web publizieren 4.5 Daten in die Datenbank einfügen Besucher sollen ihre Witze In diesem Abschnitt werden wir erfahren, wie wir die zur Verfügung selbst eintragen können stehenden Werkzeuge einsetzen, damit auch Besucher ihre eigenen Witze in unsere Datenbank eintragen können. Wenn Sie Herausforde- rungen lieben, können Sie selbst überlegen, wie man das wohl am besten bewerkstelligt, bevor Sie weiter lesen. In diesem Abschnitt wird nämlich recht wenig Neues auftauchen. Im Wesentlichen wird es eine Beispiel- applikation sein, die alles enthält, was wir bislang gelernt haben. Formular Wenn Sie Besuchern erlauben wollen, neue Witze einzugeben, ist es offensichtlich, dass Sie ein Formular benötigen. Hier ist der Code für ein Formular, das diesen Zweck erfüllt: Listing
4.5 Daten in die Datenbank einfügen 81 mulars eingetragen wurde. Diese Variable ist auch in den Arrays $_POST und $_REQUEST enthalten, die von PHP automatisch angelegt wurden. Um den abgeschickten Witz in die Datenbank einzufügen, benut- zen wir einfach mysql_query. Damit lassen wir eine Einfügeanfrage (INSERT) laufen und ergänzen die Spalte JokeText um den Inhalt der Variablen $_POST[’joketext’]: if (isset($_POST['joketext'])) { Listing $joketext = $_POST['joketext']; Ausschnitt aus jokes.php $sql = "INSERT INTO Jokes SET JokeText='$joketext', JokeDate=CURDATE()"; if (@mysql_query($sql)) { echo 'Ihr Witz wurde hinzugefügt.'; } else { echo 'Fehler beim Hinzufügen des Witzes: ' . mysql_error() . ''; } } Der einzige neue Trick im gesamten Beispiel erscheint im SQL-Code. CURDATE() Beachten Sie die Verwendung der MySQL-Funktion CURDATE(), um das aktuelle Datum als Wert der Spalte JokeDate einzufügen. MySQL hat in der Tat dutzende dieser Funktionen, die wir uns aber erst dann ansehen, wenn wir sie brauchen. Eine vollständige Funktionsreferenz finden Sie in Anhang B »MySQL-Funktionen«. Jetzt haben wir den Code zusammen, der es einem Benutzer gestattet, einen Witz einzugeben und ihn unserer Datenbank hinzu- zufügen. Was noch bleibt, ist das Formular in unsere bestehende Seite zum Ansehen der Witze in sinnvoller Weise einzupassen. Weil die meis- ten Besucher lediglich unsere Witze sehen wollen, werden wir unsere Seite nicht mit einem großen, hässlichen Formular verunstalten – das tun wir nur, wenn der Benutzer Interesse bekundet, selbst einen neuen Witz hinzuzufügen. Aus diesem Grund ist unsere Applikation ein guter Kandidat für eine Mehrzweckseite. jokes.php Die Internet-Witzedatenbank
82 4 MySQL-Daten im Web publizieren
4.6 Eine Herausforderung 83 // Text jedes Witzes in einem Absatz anzeigen while ($row = mysql_fetch_array($result)) { echo '' . $row['JokeText'] . ''; } // Wenn angeklickt, lädt dieser Link die Seite // mit dem Formular zum Eingeben eines Witzes echo 'Einen Witz hinzufügen!'; endif; ?> Laden Sie dieses Skript auf Ihren Webserver und fügen Sie über Ihren Browser ein paar Witze die Datenbank ein. Das Ergebnis sollte unge- fähr so aussehen, wie in Abbildung 4–4: Abb. 4–4 Schau her, ganz ohne SQL Das war’s! Mit einer einzigen Datei, die ein bisschen PHP-Code ent- hält, sind wir in der Lage, bestehende Witze anzuzeigen und unserer MySQL-Datenbank neue Witze hinzuzufügen. 4.6 Eine Herausforderung Als Hausarbeit überlegen Sie bitte, wie es möglich ist, auf der Seite »Diesen Witz löschen« neben jedem Witz einen Link mit der Aufschrift »Diesen Witz löschen« anzuzeigen, der beim Draufklicken den Witz aus der Daten-
84 4 MySQL-Daten im Web publizieren bank löscht und danach wieder die (aktualisierte) Witzeliste anzeigt. Hier ein paar Hinweise, um Sie auf den richtigen Weg zu bringen: ■ Sie können das nach wie vor mit einer einzigen Mehrzweckseite machen. ■ Sie brauchen dazu den SQL-Befehl DELETE, den wir in Kapitel 2 kennen gelernt haben. ■ Und jetzt das Schwierigste: Um einen bestimmten Witz zu löschen, müssen Sie in der Lage sein, ihn eindeutig zu identifizieren. Die ID- Spalte der Jokes-Tabelle wurde genau für diesen Zweck angelegt. Mit der Löschanfrage für den Witz müssen Sie die ID des zu löschenden Witzes übergeben. Der Querystring von »Diesen Witz löschen« ist der perfekte Platz, um diesen Wert hineinzuschreiben. Wenn Sie glauben, die Antwort gefunden zu haben, oder wenn Sie nur die Lösung ansehen wollen, schauen Sie in Abschnitt 4.8 nach. 4.7 Zusammenfassung In diesem Kapitel haben Sie einige neue PHP-Funktionen kennen gelernt, die es Ihnen gestatten, mit dem MySQL-Datenbankserver zu kommunizieren. Mit diesen Funktionen haben Sie Ihre erste daten- bankgestützte Website gebaut, die die Jokes-Datenbank im Web veröf- fentlicht und es Besuchern gestattet, eigene Witze hinzuzufügen. In Kapitel 5 »Design relationaler Datenbanken« gehen wir zurück auf die MySQL-Kommandozeile. Wir lernen, wie wir die Prinzipien relationaler Datenbanken und fortgeschrittene SQL-Befehle anwen- den, um komplexere Typen von Information darzustellen. Außerdem werden wir Benutzern Rückmeldungen zu den Witzen geben, die sie eingegeben haben! 4.8 Lösung der »Hausaufgabe« Hier ist die Lösung der Hausaufgabe aus Abschnitt 4.6. Folgende Änderungen wären erforderlich, um einen Link mit der Aufschrift »Diesen Witz löschen« neben jedem Witz anzubringen: ■ Bisher haben wir die Variable $addjoke zusammen mit unserem Link »Einen Witz hinzufügen!« unten auf der Seite übergeben, um anzuzeigen, dass unser Skript das Formular zur Eingabe von Wit- zen anzeigen soll, anstatt der üblichen Witzeliste. In ähnlicher Art und Weise übergeben wir jetzt eine Variable $deletejoke zusam-
4.8 Lösung der »Hausaufgabe« 85 men mit unserem Link »Diesen Witz löschen«, um zu signalisieren, dass wir einen Witz löschen wollen. ■ Für jeden Witz holen wir die Spalte ID zusammen mit der Spalte JokeText, um zu sehen, welche ID zu welchem Witz gehört. ■ Wir setzen den Wert der Variablen $deletejoke auf die ID des Wit- zes, den wir löschen wollen. Hierzu fügen wir den Wert der ID in den HTML-Code für »Diesen Witz löschen« für jeden Witz ein, den wir aus der Datenbank geholt haben. ■ Mit einem if-Statement überprüfen wir, ob $deletejoke auf einen bestimmten Wert gesetzt ist (mittels der Funktion isset), wenn die Seite geladen wird. Wenn das der Fall ist, benutzen wir den Wert, auf den sie gesetzt ist (die ID des Witzes, der gelöscht werden soll), für ein SQL-DELETE-Statement, das den fraglichen Witz löscht. Hier ist das vollständige Skript, und wenn Sie dazu Fragen haben, scheuen Sie sich nicht, diese im Sitepoint-Forum1 zu stellen: challenge.php Die Internet-Witzedatenbank
86 4 MySQL-Daten im Web publizieren // Datenbank auswählen if (!@mysql_select_db('jokes')) { exit('Auswahl der Witzedatenbank' . 'zurzeit nicht möglich.'); } // Falls ein Witz eingetragen wurde, // wird er in die Datenbank eingefügt. if (isset($_POST['joketext'])) { $joketext = $_POST['joketext']; $sql = "INSERT INTO Jokes SET JokeText='$joketext', JokeDate=CURDATE()"; if (@mysql_query($sql)) { echo 'Ihr Witz wurde hinzugefügt.'; } else { echo 'Fehler beim Hinzufügen des Witzes: ' . mysql_error() . ''; } } // Falls ein Witz gelöscht werden soll, // wird er aus der Datenbank entfernt. if (isset($_GET['deletejoke'])) { $jokeid = $_GET['deletejoke']; $sql = "DELETE FROM Jokes WHERE ID=$jokeid"; if (@mysql_query($sql)) { echo 'Der Witz wurde gelöscht.'; } else { echo 'Fehler beim Löschen des Witzes: ' . mysql_error() . ''; } } echo 'Hier sind alle Witze in unserer Datenbank:'; // ID und Text aller Witze auslesen $result = @mysql_query('SELECT ID, JokeText FROM Jokes'); if (!$result) { exit('Fehler bei der Ausführung der Abfrage: ' . mysql_error() . ''); }
4.8 Lösung der »Hausaufgabe« 87 // Text jedes Witzes in einem Absatz anzeigen, // mit einem Link "Diesen Witz löschen" daneben. while ($row = mysql_fetch_array($result)) { $jokeid = $row['ID']; $joketext = $row['JokeText']; echo '' . $joketext . ' ' . 'Diesen Witz löschen'; } // Wenn angeklickt, lädt dieser Link die Seite // mit dem Formular zum Eingeben eines Witzes echo 'Einen Witz hinzufügen!'; endif; ?>
Sie können auch lesen