4 MYSQL-DATEN IM WEB PUBLIZIEREN

Die Seite wird erstellt Henrik Schott
 
WEITER LESEN
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