Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Inhaltsverzeichnis MERKMALE ......................................................................................................................................................................... 2 STRUKTUR DER MYSQL-TABELLE............................................................................................................................... 3 VERWENDETE PHP-FUNKTIONEN................................................................................................................................ 3 FUNKTIONSWEISE - ÜBERSICHT .................................................................................................................................. 4 BASISMECHANISMEN DER DATENÜBERTRAGUNG .................................................................................................................. 4 FUNKTIONSWEISE - DETAILS ........................................................................................................................................ 4 VERBINDUNG ZUR DATENBANK HERSTELLEN........................................................................................................................ 4 BEITRAG HINZUFÜGEN ........................................................................................................................................................... 5 BEITRÄGE ANZEIGEN ............................................................................................................................................................. 5 SEITENSTEUERUNG / BLÄTTERFUNKTION .............................................................................................................................. 6 WEITERE ELEMENTE DES GÄSTEBUCHES................................................................................................................ 7 KONFIGURATIONSDATEI EINSTELLUNGEN.INC.PHP ................................................................................................................. 7 DATEI CREATE-TABLE.PHP..................................................................................................................................................... 8 DATEI ADMIN/INDEX.PHP ....................................................................................................................................................... 8 DATEI ACCESS.PHP ................................................................................................................................................................ 8 LISTING DES HAUPTSKRIPTES (INDEX.PHP)............................................................................................................. 9 © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 1 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Merkmale • Die Gästebuchseite enthält sowohl die Anzeige der bisherigen Gästebuchbeiträge mit Blätterfunktion ... ... als auch, am Seitenende, die Möglichkeit zum Erstellen und Absenden eines neuen Beitrages: • Die einzelnen Beiträge des Gästebuches werden in einer MySql-Datenbank gespeichert. • Pro HTML-Seite wird immer nur ein Ausschnitt aus der Gesamtheit der Beiträge angezeigt. Die Anzahl anzuzeigender Seiten kann in einer Konfigurationsdatei festgelegt werden. • Alle anderen Beiträge können durch eine Blätterfunktion angesteuert werden. Wenn Anfang bzw. Ende der Beiträge erreicht ist, werden in die betreffende Richtung keine Blätterlinks angezeigt. • Der PHP/HTML-Code der Gästebuchseite befindet sich in einem einzigen Skript (abgesehen von der Konfigurationsdatei). Dieser Skript ruft sich sowohl beim Abschicken als auch beim Blättern selbst auf. © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 2 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Struktur der MySQL-Tabelle Feldname Definition ID (Index bzw. PrimaryKey der Tabelle) int(10) NOT NULL auto_increment name varchar(100) DEFAULT '' NOT NULL email varchar(100) DEFAULT '' NOT NULL beitrag blob DEFAULT '' NOT NULL datum date DEFAULT '0000-00-00' NOT NULL Primärschlüssel der Tabelle ist das Feld "ID", dessen Wert automatisch hochgezählt wird (auto_increment). Zur Aufnahme größerer Textmengen ist das Feld "beitrag" vom Typ blob (max. 65535Byte). Die Tabelle wird sowohl lokal als auch auf dem öffentlichen Server durch den Skript create-table.php erzeugt. Verwendete PHP-Funktionen Im Folgenden sind die verwendeten Funktionen aufgelistet. Die Zeilennummern beziehen sich auf das Listing des Hauptskriptes index.php, beginnend auf Seite 9. Funktion Verwendung Zeile / Seite Kurzbeschreibung include() 3/9 Mit diesem Befehl wird eine PHP- oder HTML-Datei so eingeschlossen und ausgeführt, als wäre sie alleine aufgerufen worden. Argument ist der Name der einzuschließenden Datei. isset() 7/9 Überprüft Variablen auf deren Existenz. Argument: Name der zu überprüfenden Variablen Rückgabe: 1 bzw. true, wenn die betreffende Variable existiert bzw. gesetzt wurde, ansonsten 0 bzw. false. mysql_connect() 17 / 9 Öffnet eine Verbindung zum Datenbank-Server. Argument1: Hostname Argument2: Benutzername Argument3: Passwort Rückgabe: 0 bei Fehler, Verbindungs-ID bei Erfolg. Diese wird später für Abfrage und Bearbeitung der Daten benötigt. Die Verbindungs-ID wird auch als Handle oder Zeiger bezeichnet. mysql_select_db() 19 / 9 Wählt auf dem angesprochenen Datenbank-Server (siehe mysql_connect() ) eine Datenbank aus. Argument1: Datenbankname Argument2: Verbindungs-ID, siehe mysql_connect(). Argument 2 ist optional. Rückgabe: 0 bei Fehler, Select-ID bei Erfolg. die() 17,19 / 9 Beendet die Skriptausführung und gibt zuvor eine Meldung in das Webbrowserfenster aus. Argument: anzuzeigende Meldung window.alert() date() 29 / 9 JavaScript. Erzeugt ein Popup-Meldungsfenster 35 / 9 Liefert das aktuelle Datum. Argument ist eine Zeichenkette zur Ausgabeformatierung. mysql_query() 36,43 / 9 90 / 10 Sendet ein SQL-Statement an eine Datenbank. Argument 1: SQL-Statement Argument 2: Verbindungs-ID, siehe mysql_connect(). Argument 2 ist optional. Rückgabe: 0 bei Fehler, ansonsten <>0. Wenn es sich beim SQLStatement um eine SQL-Select-Anweisung handelt, ist der Rückgabewert ein Zeiger/Handle auf eine Ergebnisliste, der beispielsweise für das Auslesen der selektierten Daten innerhalb © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 3 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs einer Schleife verwendet werden kann. mysql_num_rows() 44 / 9 Liefert die Anzahl Datensätze infolge einer MySql-Select-Anweisung (s mysql_query()). Argument ist der Zeiger/Handle auf die Ergebnisliste. mysql_fetch_array() 91 / 10 Überträgt den aktuellen Ergebnisdatensatz in ein Array. Argument 1: Zeiger/Handle auf Ergebnisliste Argument 2: Festlegung der Art des Arrays (indiziert, assoziativ oder beides) Argument 2 ist optional. Bei Nichtangabe sind beide Arrayarten verfügbar. Rückgabe: Ergebnisdatensatz als Array htmlspecialchars() 92,93,96 / 10 Wandelt folgende HTML-spezifische Zeichen so um, dass sie im Webbrowser nur angezeigt und nicht ausgeführt werden: &, ", < und > Argument: zu konvertierende Zeichenkette Rückgabe: konvertierte Zeichenkette nl2br() 97 / 10 Wandelt Text-Zeilenumbrüche in das HTML-Tag <br> um Argument: zu konvertierende Zeichenkette Rückgabe: konvertierte Zeichenkette mysql_close() 197 / 12 Schließt eine bestehende Datenbankverbindung. Argument ist eine Verbindungs-ID (s. mysql_connect()) Funktionsweise - Übersicht Nach dem Öffnen der Gästebuchseite wird ein Ausschnitt der bisherigen Einträge in Form einer Ergebnistabelle angezeigt, beginnend mit dem zuletzt eingefügten Beitrag. Mittels einer Blätterfunktion kann, sofern genügend Datensätze bzw. Gästebucheinträge vorhanden sind, zu früheren bzw. späteren Beiträgen geblättert werden. Die Blätterlinks werden nicht angezeigt, wenn sich vor bzw. nach dem aktuellen Ausschnitt keine Datensätze mehr befinden. Die Erfassung neuer Gästebuchbeiträge wird mit einem Formular realisiert, welches sich unterhalb der Ergebnistabelle befindet. Basismechanismen der Datenübertragung Zur Übertragung von Daten vom Webbrowser zum Webserver werden zwei von HTTP zur Verfügung gestellte Mechanismen verwendet (HyperText-TransferProtocol - das grundlegende Protokoll des Internet): Für die Blätterfunktion: Übertragung von Daten als Argumente innerhalb der Adresse, realisiert durch die entsprechende Gestaltung der Blätterlinks. Für die Erfassung neuer Gästebuchbeiträge: Übertragung von Daten im Körper der HTTP-Nachricht mittels eines Formulars nach Betätigung des "Abschicken"-Buttons. Funktionsweise - Details Verbindung zur Datenbank herstellen Voraussetzung für die korrekte Ausführung des Skriptes ist eine erfolgreiche Verbindung zur Datenbank. Diese wird mit den Zeilen 16 bis 19 realisiert (s. Listing Seite 9). Zeilen 17 und 19 können, allgemein formuliert, folgendermaßen geschrieben werden: @funktion() or die($fehlermeldung) Es handelt sich bei diesem Ausdruck um eine or - Verknüpfung, die üblicherweise von links beginnend ausgewertet wird. Die Auswertung einer or - Verknüpfung wird abgebrochen, sobald erstmals ein true bzw. ein Wert <> 0 auftritt. Wenn funktion()also einen Wert <> 0 zurückgibt, weil sie erfolgreich ausgeführt werden konnte, wird der Ausdruck hinter or nicht mehr ausgewertet bzw. ausgeführt. Das bedeutet im Umkehrschluss: die Funktion die($fehlermeldung) wird nur ausgeführt, wenn bei mysql_connect() bzw. mysql_select_db() ein Fehler auftritt. Dann wird, bewirkt durch die Funktion die($fehlermeldung), die betreffende Fehlermeldung angezeigt und die Skriptausführung sofort beendet. © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 4 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Das Zeichen @ vor den beiden MySql-Funktionen bewirkt, dass im Fehlerfall nicht die betreffenden (englischen) StandardFehlermeldungen angezeigt werden. Beitrag hinzufügen Grundlegender Mechanismus beim Hinzufügen eines neuen Beitrages ist folgender: Der untere Teil der Gästebuchseite enthält ein Formular (s. Listing Seite 11, Zeilen 138 bis 170), das Formular wiederum enthält drei sichtbare Textfelder und eine Schaltfläche zum Absenden der Formulardaten. Die Formulardaten selbst sind die Inhalte der Textfelder, von denen jedes durch einen eindeutigen Namen identifizierbar ist. Von großer Bedeutung ist das einführende Formular-Tag in Zeile 138: <form action=<? echo $PHP_SELF ?> method='post'> Das action-Arrtribut legt fest, welche Aktion beim Betätigen der "Abschicken"-Schaltfläche ausgeführt wird. Bewirkt durch die Variable $PHP_SELF innerhalb der PHP-Insel ruft sich das Skript selbst auf, um wie weiter unten beschrieben einen neuen Datensatz in die MySql-Tabelle zu schreiben und die vorhandenen Datensätze (einschließlich des neuen) anzuzeigen. Durch die Verwendung der Variablen $PHP_SELF ist sichergestellt, dass der Skript auch weiterhin funktioniert, wenn dessen Dateiname geändert wird. Die Daten der einzelnen Formularelemente stehen im aufgerufenen Skript auf einfache Weise zur Verfügung, indem deren Namen einfach ein $ vorangestellt wird. Der Inhalt des Textfeldes mit dem Namen beitrag beispielsweise steht als PHPVariable $beitrag zur Verfügung, usw. Das Attribut method='post' in o.g. einführenden Formular-Tag führt dazu, dass die Formulardaten im Nachrichtenkörper übertragen werden. Um Beiträge zum Gästebuch hinzuzufügen sind folgende Schritte erforderlich: $go == 1 • Eintragen von mindestens Namen und Beitrag in die Wahr Falsch betreffenden Formularfelder Bei Name oder Beitrag ist keine Aktion nichts eingetragen • Übernahme eines neuen Gästebucheintrages in die Datenbank durch Betätigen des Buttons "Absenden" Wahr Falsch • JavaScript-Meldung Neue Beitrag in Anzeige des neuen Datensatzes als ersten in der Liste der "Bitte alle Datenbank schreiben vorhandenen Einträge erforderlichen Felder Bevor ein neuer Datensatz in der Datenbank gespeichert wird, ausfüllen." wird ein Codeabschnitt durchlaufen (s. Listing, Zeile 23-40, Seite 9), der durch nebenstehendes Struktogramm veranschaulicht wird: Die Variable $go enthält nur dann den Wert 1, wenn das Formular abgesendet wurde. $go repräsentiert den Wert des versteckten Formularelementes mit dem Namen go. Wenn also die Seite mit dem Gästebuch erstmals aufgerufen wird oder wenn ein erneuter Aufruf es Skriptes infolge der Blätterfunktion erfolgt, werden die Formulardaten nicht übertragen, die Variable $go existiert nicht, hat demzufolge auch nicht den Wert 1 - und es wird kein neuer Datensatz angelegt. Nach diesem Test wird durch den Ausdruck ($name == "" || $beitrag == "") in der Verzweigungsbedingung noch überprüft, ob in die dazugehörigen Formularfelder "name" und "beitrag" etwas eingetragen wurde. Ist das nicht der Fall, wird kein neuer Beitrag in das Gästebuch geschrieben, und es wird in einem Popup-Fenster mittels JavaScript eine diesbezügliche Meldung angezeigt. Voraussetzung zum Anlegen eines neuen Datensatzes sind also: 1. das vorherige Betätigen von "Absenden" und 2. das Ausfüllen aller Pflichtfelder. Angelegt wird ein neuer Datensatz durch folgendes SQL-Statement: INSERT INTO $TableName (name,email,datum,beitrag) VALUES ('$name','$email','$datum','$beitrag') Die Werte für VALUES werden den korrespondierenden Formularfeldern entnommen. Beiträge anzeigen Zuständig für die Anzeige vorhandener Gästebucheinträge ist der Codeabschnitt Zeile 87 bis 110 (s. Listing Seite 10). Die anzuzeigenden Datensätze werden durch das SQL-Statement SELECT * FROM $TableName ORDER BY ID DESC LIMIT $pos,$BeitraegeProSeite festgelegt, gespeichert in der Variabeln $sql. ORDER BY ID DESC legt fest, dass nach dem Feld ID absteigend sortiert wird. Damit befindet sich der aktuelle Datensatz immer am Beginn der Ergebnisliste. © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 5 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Durch LIMIT von, Anzahl wird ab einem Wert, der durch $pos bestimmt ist, nur die Anzahl Datensätze angezeigt, die dem Inhalt der Variablen $BeitraegeProSeite entspricht. Mit dem Ausdruck $Resultat = mysql_query ($sql) wird das beschriebene SQL-Statement ausgeführt. Das es sich um eine SQL-Select-Anweisung handelt, wird dadurch eine Ergebnisliste zurückgeliefert, repräsentiert durch die Variable $Resultat. Innerhalb einer While-Schleife (Zeilen 91 bis 110! ) werden Daten zeilenweise aus der Ergebnisliste ausgelesen und entsprechenden Variablen zugewiesen. Der Inhalt dieser Variabeln wiederum wird im HTML-Teil der Schleife angezeigt, bewirkt durch eine PHP-Insel für jede Variable. Diese prinzipielle Wirkungsweise ist in nebenstehendem Solange Zeilen in $Resultat vorhanden sind Struktogramm dargestellt. Name in Variable $name schreiben Emailadresse in Variable $email schreiben Die Laufbedingung der Schleife lautet konkret: $zeile=mysql_fetch_array($Resultat) Die Funktion mysql_fetch_array() überfuhrt die Datum in Variable $datum schreiben Beitrag in Variable $beitrag schreiben Inhalt dieser Variablen als HTML ausgeben Ergebnisliste zeilenweise in ein sog. assoziatives Array mit dem Namen $zeile. Bei assoziativen Arrays werden, im Gegensatz zu indizierten Arrays, die einzelnen Zeilen des Datenfeldes durch Schlüsselwörter angesprochen. Diese Schlüsselwörter entsprechen den Spaltennamen der zugrundeliegenden MySql-Tabelle. Somit kann beispielsweise durch den Ausdruck $zeile["name"] der Inhalt des Arrayelementes name eines Datensatzes bzw. einer Zeile der Ergebnisliste ermittelt werden. mysql_fetch_array($Resultat)beginnt beim ersten Datensatz der Ergebnisliste und wandert nach der Überführung der Daten in das assoziative Array $zeile automatisch zum nächsten Datensatz, bis das Ende der Ergebnisliste erreicht ist. Bemerkenswert ist noch folgende Tatsache: in Zeile 98 wird der PHP-Codeabschnitt zunächst einmal beendet, ohne dass die schließende geschweifte Klammer des Blockes der Schleifenanweisungen erreicht wurde. Die Zeilen 100 bis 108 enthalten den HTML-Code zur Darstellung einer Zeile der Ergebnistabelle. Erst in Zeile 110 wird die Schleife durch die Anweisung <?php } ?> abgeschlossen. In den Zeilen 92, 93 und 96 wird die PHP-Funktion htmlspecialchars() verwendet. Diese wandelt wichtige HTMLspezifische Zeichen so um, dass sie im Webbrowser dargestellt werden. Würde dies nicht erfolgen, könnte beispielsweise ein vom Besucher eingegebenes einfaches </table> die gesamte Darstellung der Gästebuchseite zerstören. htmlspecialchars() sorgt dafür, dass in diesem Fall </table> einfach nur angezeigt wird. Das Formularfeld für die Erfassung der Gästebuchbeiträge ist mehrzeilig. Der Besucher kann Zeilenumbrüche durch Verwendung der Enter-Taste erzeugen. Um diese Umbrüche in der HTML-Ergebnistabelle korrekt darzustellen, wird bezogen auf die Variable $beitrag zusätzlich zu htmlspecialchars() die Funktion nl2br() verwendet. Dadurch werden solche Umbrüche in das HTML-Tag <br> verwandelt und im Webbrowser auch als Umbrüche dargestellt. Seitensteuerung / Blätterfunktion Im Gästebuch wird jeweils nur ein Ausschnitt aus der Gesamtzahl an Beiträgen dargestellt, einstellbar durch die Variable $BeitraegeProSeite. Das macht die Implementierung einer Blätterfunktion erforderlich. Grundlegender Mechanismus dieser Blätterfunktion ist die Übertragung von Benutzerdaten innerhalb der Adresse. Dies wird durch die Generierung von entsprechend gestalteten Links realisiert (s: Listing S. 9, Zeilen 47 bis 52). Link auf frühere Einträge (Rückwärtsblättern): <a href=$PHP_SELF?pos=($pos + $BeitraegeProSeite)>&lt;&lt Frühere Einträge</a> Link auf spätere Einträge (Vorwärtsblättern): <a href=$PHP_SELF?pos=($pos - $BeitraegeProSeite)>Spätere Einträge &gt;&gt</a> Auch hier ruft sich wie weiter oben bereits unter Punkt "Beitrag hinzufügen" beschrieben das Skript, bewirkt durch die Verwendung von =$PHP_SELF , selbst auf. Man muss also auch an diesen Stellen bei eventueller Änderung des Dateinamens des Skriptes nichts ändern. Bis hierhin handelt es sich um einen ganz normalen Link auf die Datei index.php. Um zusätzlich dazu Daten vom Webbrowser an den Server übertragen zu können werden diese, eingeleitet durch ?, als Argumente an die Adresse (nichts anderes ist der Verweis auf index.php) angehängt. pos=x bildet ein Paar aus Name und Wert (getrennt mit einem & könnten noch weitere solcher Paare angefügt werden). Das Argument pos ist, ähnlich wie beim Übertragen von Daten mittels Formular, im aufgerufenen Skript als PHP-Variable $pos verfügbar. Die Herleitung der Formeln zur Berechnung der Linkziele für das Vorwärts- bzw. Rückwärtsblättern verdeutlicht die folgende Abbildung. Man stelle sich die zugrundeliegende MySql-Tabelle blockweise geteilt und absteigend sortiert vor. Die © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 6 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Länge der einzelnen Blöcke wird in der Konfigurationsdatei einstellungen.inc.php durch die Variable $BeitraegeProSeite festgelegt. Die Anzeige der einzelnen Blöcke und der Blätterlinks auf der Gästebuchseite ist in der Abbildung unterhalb der Überschrift "Blätterfunktion" angedeutet. Prinzipdarstellung der Seitensteuerung bzw. Blätterfunktion Spalten der MySql-Tabelle Blätterfunktion ID 5 6 3 Name ... ... weitere Felder ... ... pos 13 12 1 spätere >> 8-11 7 9 10 11 ... ... ... ... ... ... ... ... 11 10 9 8 12= 8+ 4 12-13 << frühere spätere >> 4-7 12 14 15 16 ... ... ... ... ... ... ... ... 7 6 5 4 8= 4+ 4 8-11 << frühere spätere >> 0-3 17 18 19 20 ... ... ... ... ... ... ... ... 3 2 1 0 4 = 0+ 4 4-7 << frühere 2 ergibt sich aus SQL-Sortierreihenfolge Links nur anzeigen, wenn gilt: $pos = $pos + $BeitraegeProSeite (Rückwärtsblättern) 1 $AnzahlEintraege > $pos + $BeitraegeProSeite 2 $pos - $BeitraegeProSeite >= 0 Linkziel aktuelle Position $pos = $pos - $BeitraegeProSeite (Vorwärtsblättern) ($AnzahlEintraege entspricht der Anzahl der Datensätze in der MySql-Tabelle) 3 Blöcke ergeben sich aus der SQL-Anweisung LIMIT: SELECT * FROM $TableName ORDER BY ID DESC LIMIT $pos,$BeitraegeProSeite Die Anzeige der Blätterlinks wird durch folgende Codeabschnitte realisiert: Oberhalb der Ergebnistabelle: s. Listing Zeilen 70 bis 83 auf Seite 10 Unterhalb der Ergebnistabelle: s. Listing Zeilen 114 bis 127 auf Seite 11 Die Blätterlinks werden mit echo $LinkFruehere bzw echo $LinkSpaetere erzeugt. ($AnzahlEintraege > $pos + $BeitraegeProSeite) Wahr Link auf frühere Beiträge anzeigen Sie werden jedoch entsprechend der nebenstehenden Struktogramme nur angezeigt, wenn sich vor bzw. nach der aktuellen Position noch Daten befinden (s. Abbildung Kreis 1 und Kreis 2). ($pos - $BeitraegeProSeite >= 0) Wahr Weitere Elemente des Gästebuches Link auf spätere Beiträge anzeigen Konfigurationsdatei einstellungen.inc.php Diese Datei enthält die Einstellmöglichkeit für die Anzahl pro Seite darzustellenden Gästebucheinträge und wichtige Angaben für MySql (Tabellen-, Datenbank- und Nutzernamename sowie Passwort). © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 7 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Die Auslagerung dieser Angaben in eine eigenständige Datei ist deshalb sinnvoll, weil die MySql-Angaben in drei Dateien benötigt werden: in index.php (der Hauptskript), in create-table.php und in admin/index.php (der Skript zum Löschen von Gästebucheinträgen). Änderungen, z.B. des MySql-Serverpasswortes, sind im Bedarfsfall bei dieser Verfahrensweise nur an einer einzigen Stelle notwenig, nämlich in einstellungen.inc.php. Die Dateibezeichnung einstellungen.inc.php soll sicherstellen, dass der Inhalt der Datei nicht angezeigt wird. Würde die Datei nur einstellungen.inc heißen, könnte ein Nutzer, der diesen Namen in die Adressleiste eingibt, deren Inhalt sehen. Die zusätzliche Erweiterung .php führt dazu, dass in diesem Fall die Datei ausgeführt werden würde. Äußerlich wäre dann nichts sichtbar. Die Erweiterung .inc soll verdeutlichen, dass es sich um eine Datei handelt, die irgendwo eingebunden wird (include). Datei create-table.php Dient der Erzeugung der MySql-Tabelle. Dieser Skript ist sowohl lokal einmal auszuführen als auch, nach dem Transfer des lokal erstellten und getesteten Gästebuches, auf dem öffentliche Server. Datei admin/index.php Mit diesem Skript können Beiträge gelöscht werden. Wichtiger Hinweis: Wer ein Gästebuch betreibt, sollte regelmäßig und in nicht zu großen Zeitabständen den Inhalt überprüfen. Unqualifizierte Beiträge und solche, die juristischen Ärger bereiten könnten, sollten gnadenlos gelöscht werden. Verantwortlich für den Inhalt von Gästebüchern sind deren BetreiberInnen. Die sicherste Möglichkeit ist, sich neue Beiträge per Email zuschicken zu lassen. Die erforderlichen PHP-Mechanismen gehen aus der Übung 5 - Kontaktformular hervor. Datei access.php Der Admin-Bereich sollte natürlich vor Fremdzugriffen geschützt werden. Das ist sehr einfach möglich, indem im Verzeichnis .../guestbook/admin der Skript access.php ausgeführt wird. Innerhalb des dann folgenden Dialoges kann der betreffende Bereich mit Benutzernamen und Passwort geschützt werden. Dabei entstehen im betreffenden Verzeichnis die Dateien .htaccess und .htpassword. Durch Löschen dieser Dateien kann der Schutz wieder aufgehoben werden. Wichtiger Hinweis: Nach dem Ausführen von accesse.php sollte die Datei auf dem öffentlichen Server wieder gelöscht werden. Ansonsten könnte jeder, der diesen Skript ausführt, den Bereich mit neuen Zugriffsdaten versehen. accesse.php sollte natürlich für eine eventuelle spätere Verwendung weiterhin lokal verfügbar sein. © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 8 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung PHP / MySQL - Kurs Listing des Hauptskriptes (index.php) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <?php //Wichtige Variablen laden: include ("einstellungen.inc.php"); //Positionszähler für Seitensteuerung (Blättern) bei erstem //Sktriptaufruf initialisieren: if(isset($pos) == 0) { $pos = 0; } /*Verbindung zur Datenbank herstellen /ACHTUNG: vor dem Hochladen auf den Kurs-Server muss in der /Datei 'einstellungen.inc.php' der Wert für '$passwort' auf 'phpmysql' / eingestellt werden. */ $fehlermeldung = "Fehler beim Konnektieren des MySQL-Servers."; @mysql_connect("localhost",$DbUserName,$passwort) or die($fehlermeldung); $fehlermeldung = "Fehler bei Auswahl der Datenbank '$DbName'."; @mysql_select_db($DbName) or die($fehlermeldung); //Daten in Datenbank schreiben: //Wenn Formular abgesendet wurde: if ($go == 1) { //Wenn eines der erforderlichen Eingabefelder leer ist Meldung anzeigen. //Diese wird mittels JavaScript erzeugt: if ($name == "" || $beitrag == "") { ?> <script language = 'JavaScript'> window.alert('Bitte alle erforderlichen Felder ausfüllen.'); </script> <?php } else { //Wenn alle erforderlichen Eingabefelder gefüllt sind und auf "Absenden" //geklickt wurde, Übernahme in Datenbank (neuer Datensatz): $datum = date ("Y-m-d"); mysql_query ("INSERT INTO $TableName (name,email,datum,beitrag) VALUES ('$name','$email','$datum','$beitrag')"); } //ENDE if } //ENDE if //Anzahl der Datensätze ermitteln: $ResultatAlle = mysql_query ("SELECT ID from $TableName"); $AnzahlEintraege = mysql_num_rows($ResultatAlle); //Links für das Blättern definieren: $LinkFruehere = "<a href=".$PHP_SELF. "?pos=".($pos + $BeitraegeProSeite). © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 9 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 PHP / MySQL - Kurs ">&lt;&lt Frühere Einträge</a>"; $LinkSpaetere = "<a href=".$PHP_SELF. "?pos=".($pos - $BeitraegeProSeite). ">Spätere Einträge &gt;&gt</a>"; ?> <html> <head> <title>Gästebuch</title> <link rel='stylesheet' href='formate.css' type='text/css'> </head> <body bgcolor='#C0DCC0'> <center> <h1>Gästebuch</h1> <p><?php echo $AnzahlEintraege; ?> Beiträge insgesamt (aktuelle zuerst)</p> <!--BEGINN Ergebnistabelle--> <table border=0 align='center' width='85%' cellspacing='3' cellpadding='3' class='tabtext' bgcolor='#AA9F55'> <!--BEGINN obere Seitensteuerung--> <tr> <td width='50%' align='left' bgcolor='#AA9F55'> <?php //Ggf. Link für das Rückwärtsblättern erzeugen: if ($AnzahlEintraege > $pos + $BeitraegeProSeite) { echo $LinkFruehere; } ?> &nbsp;</td> <td width='50%' align='right' bgcolor='#AA9F55'> <?php //Ggf. Link für das Vorwärtsblättern erzeugen: if ($pos - $BeitraegeProSeite >= 0) { echo $LinkSpaetere; } ?> &nbsp;</td> </tr> <!--ENDE obere Seitensteuerung--> <?php $sql = "SELECT * FROM $TableName ORDER BY ID DESC LIMIT $pos,$BeitraegeProSeite"; $Resultat = mysql_query ($sql); while ($zeile=mysql_fetch_array($Resultat)) { $name=htmlspecialchars($zeile["name"]); $email=htmlspecialchars($zeile["email"]); $datum=$zeile["datum"]; $beitrag=$zeile["beitrag"]; $beitrag=htmlspecialchars($beitrag); $beitrag=nl2br($beitrag); ?> © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 10 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 PHP / MySQL - Kurs <!--BEGINN Ergebniszeile--> <tr bgcolor='#FFFBF0'> <td colspan='2'> <b>Name:</b>&nbsp;<?php echo $name; ?> &nbsp; <b>Datum:</b>&nbsp;<?php echo $datum; ?> &nbsp;Email:&nbsp;<?php echo $email; ?> <hr size='1' noshade> <?php echo $beitrag; ?> </td> </tr> <!--ENDE Ergebniszeile--> <?php } ?> <!--BEGINN untere Seitensteuerung--> <tr> <td width='50%' align='left' bgcolor='#AA9F55'> <?php //Ggf. Link für das Rückwärtsblättern erzeugen: if ($AnzahlEintraege > $pos + $BeitraegeProSeite) { echo $LinkFruehere; } ?> &nbsp;</td> <td width='50%' align='right' bgcolor='#AA9F55'> <?php //Ggf. Link für das Vorwärtsblättern erzeugen: if ($pos - $BeitraegeProSeite >= 0) { echo $LinkSpaetere; } ?> &nbsp;</td> </tr> <!--ENDE untere Seitensteuerung--> </table> <!--ENDE Ergebnistabelle--> <h2>Eigenen Beitrag verfassen:</h2> <p>(Fettgedruckte Felder müssen ausgefüllt werden!)</p> <!--BEGINN Formular - Formular ruft sich selbst auf ($PHP_SELF):--> <form action=<? echo $PHP_SELF ?> method='post'> <!--Verstecktes Feld 'go' - zur Kennzeichnung, ob Formular gesendet wurde--> <input type='Hidden' name='go' value='1'> <table border='0' align='center' width='85%' class='tabtext' cellpadding='3' cellspacing='3' bgcolor='#AA9F55'> <tr bgcolor='#AA9F55'> <td><b>Name:</b></td> <td> <!--Eingabefeld für den Namen--> <input type='Text' name='name' size='50'> </td> © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 11 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 PHP / MySQL - Kurs </tr> <tr bgcolor="#AA9F55"> <td>Email: </td> <td> <!--Eingabefeld für Email--> <input type='Text' name='email' size="50" maxlength="s"> </td> </tr> <tr bgcolor="#FFFBF0"> <td valign=top><b>Beitrag:</b> </td> <td> <!--Eingabefeld für den Textbeitrag--> <textarea name='beitrag' cols='80' rows='10' class='tabtext'></textarea> </td> </tr> <tr> <td COLSPAN='2' ALIGN='CENTER' bgcolor="#AA9F55"> <input type='Submit' value='Abschicken'> </td> </tr> </table> </form> <!--ENDE Formular--> </center> </body> </html> <?php //DB-Verbindung schließen: mysql_close(); ?> © R.-P. Keil Übung 6 - Datenbankgestütztes Gästebuch - Beschreibung / Seite 12 von 12 04.02.05 16:10/ D:\WebProjekte\webwerft-berlin\@kurs\uebungen\u6\aufgabe\beschreibung-gb.doc / 27k / 20809 Zeichen