Workshops - Freitag, Februar 22, 2008 16:24

Gästebuch mit PHP

1. Einleitung

In diesem Workshop soll aufgezeigt werden wie man mit einfachen Mitteln ein eigenes Gästebuch-Script erstellen kann.

2. Aufbau

2.1 Die Konfiguration

Hier speichern wir zunächst die Angaben für die Datenbank-Verbindung zum MySQL-Server in das Array $config. Dazu kommen dann noch weitere Einstellungen für die Ausgabe des eigentlichen Gästebuchs. In unserem Fall ist das zum einen die Einstellung, die festlegt, ob es dem Eintragenden erlaubt sein soll HTML-Code im Eintrag zu verwenden und zum anderen die Einstellung wie viele Beiträge pro Seite angezeigt werden sollen.

<?php 
    $jetzt 
time(); 
    
$config = array(); 
    
// Beginn der Konfiguration - bitte hier anpassen 
     
    // Datenbank - Verbindungsdaten 
    
$config[‘db_name’] = ‘g_buch’;         // Name der Datenbank 
    
$config[‘db_user’] = ‘root’;           // Datenbank - User 
    
$config[‘db_pass’] = ;               // Datenbank - Passwort 
    
$config[‘db_host’] = ‘localhost’;      // Datenbank - Host 
    
$config[‘db_tabname’] = ‘gaestebuch’;  // Datenbank Tabellenname 
    // Einstellungen Gästebuch 
    
$config[‘eintr_seite’] = ‘15′;         // Einträge pro Seite 
    
$config[‘html_on’] = ‘1′;              // HTML erlauben (1=ja, 0=nein) 
    // Ende der Konfiguration 
?>

2.2 Datenbank Dump einspielen

Als nächstes müssen wir in der Datenbank eine Tabelle für die Einträge des Gästebuchs anlegen. Das geht bei den meisten Web-Hostern über die Oberfläche von phpMyAdmin, indem wir links in die gewünschte Datenbank wechseln und dann unter dem oben stehenden Punkt SQL den Inhalt der Datei dump.sql in das Formular kopieren und mit ok bestätigen. Nun sollte es in der Datenbank eine Tabelle mit dem Namen “gaestebuch” existieren. Diese ist jetzt auf der Linken Seite unter dem Namen der Datenbank sichtbar.

Diese Tabelle enthält neben den Spalten für die Daten des Eintragenden und der Nachricht auch noch eine Spalte (id), in der für jeden Eintrag eine eindeutige id notiert wird. Dies geschieht über die autoincrement Funktion von MySQL, das heißt der Wert dieser Spalte wird bei jedem neuen Eintrag um eins hochgezählt im Vergleich zum vorhergehenden Eintrag. Des weiteren existiert noch die Spalte timestamp. Hier werden wir später den Zeitpunkt des Eintrags als sogenannten Timestamp (Anzahl der Sekunden seit 01.01.1970) speichern.

CREATE TABLE `gaestebuch` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default ”,
  `location` varchar(100) NOT NULL default ”,
  `email` varchar(100) NOT NULL default ”,
  `url` varchar(100) NOT NULL default ”,
  `message` text NOT NULL,
  `timestamp` int(14) NOT NULL default ’0′,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

2.3 Die Verbindung zur Datenbank aufbauen

Anschließend bauen wir mit Hilfe der php-Funktionen mysql_connect() und mysql_select_db() die Verbindung zur Datenbank auf und fangen Fehler beim Verbindungsaufbau mit Hilfe von die() ab und ersetzen sie durch eigene Fehlermeldungen.

<?php 
    
// Datenbankverbindung aufbauen 
    
$db mysql_connect($config[‘db_host’], $config[‘db_user’], $config[‘db_pass’]); 
    if(!
$db)die(“Server nicht erreichbar.”); 
    if(!
mysql_select_db($config[‘db_name’], $db))die(“Datenbank nicht erreichbar.”); 
    
// Ende Datenbankverbindung aufbauen 
?>

2.4 Das Formular

Das Formular wird dem User später die Möglichkeit geben seinen Beitrag in das Gästebuch einzutragen. Wir erstellen ein Formular mit vier Input - Feldern (Name, Ort, E-Mail, Internetadresse) und einer Textarea für die eigentliche Nachricht, dass wir in der Variable $formular speichern. Die Formatierung des Formular erfolgt in der Datei styles.css per Cascading Stlye Sheets (CSS).

<?php 
// Formular aufbauen 
$formular .= ‘ 
             <form action=”index.php” method=”post” /> 
             <fieldset> 
             <legend>neuer Eintrag</legend> 
             <label for=”name”>Name<br /> 
                 <input type=”text” id=”name” name=”name” value=”" /> 
             </label><br /> 
             <label for=”location”>Ort<br /> 
                 <input type=”text” id=”location” name=”location” value=”" /> 
             </label><br /> 
             <label for=”email”>E-Mail<br /> 
                 <input type=”text” id=”email” name=”email” value=”" /> 
             </label><br /> 
             <label for=”url”>Internet - Adresse<br /> 
                 <input type=”text” id=”url” name=”url” value=”" /> 
             </label><br /> 
             <label for=”message”>Eintrag<br /> 
                 <textarea id=”message” name=”message” cols=”10″ rows=”10″> 
             </textarea></label><br /> 
                 <input type=”submit” name=”eintragen” value=”eintragen” /> 
             </fieldset> 
             </form>’

// Ende Formular aufbauen 
?>

2.5 Usereingaben prüfen

Wenn nun ein Benutzer über das Formular einen Eintrag an das Script sendet soll dieser in der Datenbank gespeichert werden, damit er später wieder abrufbar ist.

Bevor dies geschieht ist allerdings neben einigen anderen Dingen noch zu prüfen, ob der Beitrag HTML-Code enthält, welchen wir ja eventuell in der Konfiguration nich gestattet haben. Hierfür gibt es in php bereits die Fuktion strip_tags(), mit der wir einfach alle HTML-Tags aus einem String entfernen.

Außerdem sollte man niemals Benutzereingaben ungeprüft in eine Datenbank speichern, da ein böswilliger Benutzer auf diesem Weg erheblichen Schaden anrichten kann, indem er durch seine Eingabe den Query Befehl unterbricht und eigene Befehle anhängt. Aus diesem Grund gibt es seit der php-Version 4.3.0 die Funktion mysql_real_escape_string(). Hiermit werden gefährliche Zeichen wie zum Beispiel Hochkommata (’) oder Anführungszeichen (”) escaped, das heißt ihnen wird ein Backslash (\) vorangestellt und somit werden sie von MySQL nicht interpretiert. Vorher sollten wir aber noch - für den Fall das php mit magic_quotes_gpc = on betrieben wird, die hierdurch bereits escapten Zeichen mittels stripshlashes() zurückwandeln.

Abschließend ist noch der Fall zu bedenken, wie mit Sonderzeichen in der Benutzereingabe verfahren werden soll, die in HTML eine besonders Bedeutung haben wie zum Beispiel < oder >. Wir werden diese mit Hilfe der Funktion htmlspecialchars() in die zugehörigen HTML-Codes umwandeln. So wird zum beispiel aus < ein < und aus > ein >. Diese wirren Zeichenkombinationen werden später beim Ausgeben der Daten wieder in ihrer ursprünglichen Form angezeigt.

Da wir nun ein ganze Menge Prüfungen haben, die wir für jede einzelne der fünf Benutzereingaben durchführen müssen sollten wir dies mit Hilfe einer selbst geschriebenen Funktion lösen. So brauchen wir jede Eingabe nur die Funktion durchlaufen lassen und in dieser werden dann die einzelnen Prüfungen abgearbeitet. Daher erstellen wir die Funktion eingaben_pruefen() und füttern sie mit dem zu prüfenden Text und der Einstellung ob HTML-Tags in den Eingaben erlaubt sein sollen oder nicht.

Die Funktion sollte am Anfang oder am Ende der kompletten PHP Datei sein.

<?php 
// Funktionen 
function eingaben_pruefen($text$html_on

     if(
$html_on == 0
     { 
     
$text strip_tags($text);             // HTML entfernen, wenn gewuenscht 
     
$text htmlspecialchars($text);       // Sonderzeichen maskieren 
     

     if(
get_magic_quotes_gpc())   
        
$text stripslashes($text);         // escapes von macig_quotes aufloesen, wenn aktiviert 
     
$test mysql_real_escape_string($text);// best. Zeichen escapen 
     
return $text

// Ende Funktionen 
?>

Bevor wir die Eingaben nun endlich in die Datenbank schreiben können haben wir noch ein kleines Problem mit der Internetadresse. Dies liegt darin, das manche Benutzer ihr Internetadresse ohne führendes http:// eingeben, was unter Umständen zu Problemen führt. Also prüfen wir mit Hilfe von eregi() ob ein http:// enthalten ist und wenn nicht stellen wir dies nachträglich der Benutzereingabe voran.

An dieser Stelle könnte man noch prüfen, ob für die bestimmte Felder überhaupt Angaben gemacht wurden. Hierrauf verzichten wir allerdings zunächst aus Gründen der Übersichtlichkeit.

<?php 
    
// Daten eintragen 
    
if(isset($_POST[‘eintragen’])) 
    { 
    
$name_geprueft eingaben_pruefen($_POST[‘name’], $config[‘html_on’]); 
    
$location_geprueft eingaben_pruefen($_POST[‘location’], $config[‘html_on’]); 
    
$email_geprueft eingaben_pruefen($_POST[‘email’], $config[‘html_on’]); 
    
$url_geprueft eingaben_pruefen($_POST[‘url’], $config[‘html_on’]); 
    
$message_geprueft eingaben_pruefen($_POST[‘message’], $config[‘html_on’]); 
    
// Wenn url eingetragen und kein http eingegeben, hinzufügen 
    
if(!eregi(‘http://’$url_geprueft) && $url_geprueft != “”) {  
        
$url_geprueft‘http://’.$url_geprueft
    } 
?>

2.6 den Eintrag in die Datenbank speichern

Nachdem wir nun alle Eingaben auf Herz und Nieren überprüft haben ist es an der Zeit diese in die Datenbank zu schreiben. Dies machen wir mit einem INSERT-Statement, dem wir neben den Benutzereingaben noch den aktuellen Timestamp hinzufügen, den wir zu Beginn des Scripts mit time() in die Variable $jetzt gespeichert haben.

<?php 
    sql 
“ 
       INSERT INTO ”
.$config[‘db_tabname’].“ 
       SET 
       id = ”, 
       name = ’”
.$name_geprueft.“‘, 
       location = ’”
.$location_geprueft.“‘, 
       email = ’”
.$email_geprueft.“‘, 
       url = ’”
.$url_geprueft.“‘, 
       message = ’”
.$message_geprueft.“‘, 
       timestamp = ’”
.$jetzt.“‘ 
       ”

    
$query mysql_query($sql) or die(“Query nicht erfolgreich.”); 
    } 
    
// Ende Daten eintragen 
?>

2.7 Die Navigation

Als nächstens wende wir uns der Navigation zu. Da unser Gästebuch ja einmal viele Einträge beinhalten soll wäre es etwas ungünstig, wenn diese alle auf einer Seite ausgegeben werden. Daher haben wir zu vorher in der Konfiguration festgelegt, wie viele Einträge pro Seite zu sehen sein sollen.

Um zu bestimmen, wie viele Seiten unser Gästebuch haben wird müssen wir also erst einmal wissen, wie viele Einträge zur Zeit vorhanden sind. Diese Frage beantwortet ein SELECT-Statement, das im Anschluss mit mysql_num_rows() die Anzahl der von der Abfrage erfassten Zeilen ausgibt. Da wir keinerlei WHERE Bedingungen gesetzt haben erhalten wir also die Zahl aller Einträg im String $anzahl.

Nun teilen wir die Anzahl der Einträge durch die Zahl der Beiträge auf einer Seite. Da wir hier in den allermeisten Fällen keine Ganze Zahl als Ergebnis erhalten werden müssen wir dieses mit Hilfe von ceil() noch aufrunden, damit ausreichend Seiten in der Navigation angezeigt werden. Nun lassen wir mittels einer for-Schleife für jede Seite einen Link erstellen. Diesem link wird der Wert start angehängt, der später festlegen wird, von welchem Eintrag an die festgelegte Anzahl Einträge ausgegeben werden soll. Zum Schluss speichern wir die Navigation noch in der Variable $navigation.

<?php 
    
// Navigation aufbauen 
    
$sql “SELECT * FROM ”.$config[‘db_tabname’].“ ”
    
$query mysql_query($sql) or die(“Query nicht erfolgreich.”); 
    
$anzahl mysql_num_rows($query); 
     
    
$seiten ceil($anzahl $config[‘eintr_seite’]); 
         for(
$x=1$x <= $seiten$x++) 
         { 
         
$navigation .= ‘<a href=”index.php?start=’
         
$navigation .= (($x 1) * $config[‘eintr_seite’]).‘”>’
         
$navigation .= $x.‘</a>  ’
         } 
    
// EndeNavigation aufbauen 
?>

2.8 Ausgabe der Einträge

Nun können wir uns abschließend mit dem Auslesen der Einträge aus der Datenbank-Tabelle befassen. Zunächst einmal ist zu prüfen, ob ein Wert in der Variable $start gespeichert ist, der festlegt, welche Einträge angezeigt werden sollen. Ist dies nicht der Fall wird mit dem neusten Eintrag ($start = 0;) begonnen. Das SELECT-Statement gibt so viele Zeilen aus der Tabelle aus, wie Einträge pro Seite erscheinen sollen. Gezählt wir ab dem festgelegten Startwert.

Die einzelnen Zeilen der Tabelle werden mittels mysql_fetch_array() zeilenweise in ein assoziatives Array gespeichert und über eine while-Schleife ausgegeben. Das bedeutet, das solange ein weiterer Datensatz ausgegeben wird, bis alle von SELECT-Statement abgefragten Zeilen abgearbeitet sind. Diese Ausgabe wird nun formatiert und dem String $eintraege angehängt, so dass am Ende alle Einträge darin gespeichert sind.

Wichtig ist, das wir bei der Ausgabe der Nachricht darauf achten, dass alle Zeilenumbrüche die der Benutzer in der Textarea eingegeben hat mit der Funktion nl2br() in den HTML-Tag
ungewandelt werden. Ansonsten würden Zeilenumbrüche aus der Eingabe nicht übernommen und mehrzeilige Beiträge als eine Zeile dargestellt.

Außerdem wandeln wir noch den Timestamp, also den Zeitpunkt des Eintrags, mittels der date() Funktion in ein lesbares Datum um und löschen mit Hilfe von unset() die Variablen, die wir innerhalb der while-Schleife belegt haben.

<?php 
    
// Gaestebucheintraege aufbauen 
    
if(!isset($_GET[’start’]))  
        
$start 0
    else 
        
$start $_GET[’start’]; 
     
    
$sql “SELECT * FROM ”.$config[‘db_tabname’].“ 
            ORDER BY timestamp LIMIT ”
.$start.“, ”.$config[‘eintr_seite’].“ ”;     $query mysql_query($sql) or die(“Query nicht erfolgreich.”); 
     
    while (
$row mysql_fetch_array($query)) 
    { 
        
// Links nur einbauen, wenn vorhanden 
        
if($row[‘url’] != “”
            
$url ‘ (<a href=”‘.$row[‘url’].‘”>Homepage</a>)’
        // Wenn E-Mail eingetragen, Name mit E-Mail Link versehen. Sonst Namen ohne Link ausgaben 
        
if($row[‘email’] != “”
            
$name ‘<a href=”mailto:’.$row[‘email’].‘”>’.$row[‘name’].‘</a>’
        else  
            
$name $row[‘name’]; 
     
        
$zeitpunkt date(“d.m.Y - H:i”$row[‘timestamp’]); // Timestmap umwandeln 
     
        
$eintraege .= ‘<div class=”eintrag”> 
                       <p class=”head”>’
.$row[‘id’].‘. Eintrag: ’.$name..$url.‘ 
                       aus ’
.$row[‘location’].‘ schrieb am ’.$zeitpunkt.‘ Uhr</p> 
                       ’
.nl2br($row[‘message’]).‘ 
                       </div>’

        unset(
$url$zeitpunkt$name); 
    } 
    
// Ende Gaestebucheintraege aufbauen 
?>

2.9 Teile in das HTML Gerüst einfügen

Zum Schluss können wir nun unseren Variablen $formular, $navigation und $eintraege in einem HTML Gerüst positionieren und dieses mit echo ausgeben. Im Head-Bereich des HTML Gerüsts binden wir vorher noch die für die Formatierung verantwortliche Datei style.css ein.

<?php 
    
// Ausgabe in HTML Grundgerüst 
    
echo ‘<html> 
         <head> 
         <title>Gästebuch</title> 
         <link rel=”stylesheet” href=”styles.css” mce_href=”styles.css” type=”text/css”> 
         </head> 
         <body> 
         <div class=”form”>’
.$formular.‘</div> 
         <div class=”navi”>’
.$navigation.‘</div> 
         ’
.$eintraege.‘ 
         <div class=”navi”>’
.$navigation.‘</div> 
         </body> 
         </html>’

?>



wichtige Artikel