info@a-coding-project.de

Entwicklung eines einfachen Gästebuches

Gästebücher werden mittlerweile auf unzähligen Webseiten im Internet eingesetzt. Ersteller bzw. Betreiber einer Webseite bekommen so eine Rückmeldung über ihr Angebot und einen Einblick über die Besucher. Trotz der mittlerweile vorhandenen kostenlosen Gästebuch-Services im Internet ist es nicht besonders schwer, ein eigenes Skript für ein Gästebuch zu schreiben.

Welche Informationen sollen im Gästebuch enthalten sein?

Wie genau die Informationen sein sollen, kann jeder Programmierer eines Gästebuches selbst entscheiden. Da gibt es keine Richtlinien, Vorschriften o.ä. Es empfiehlt sich allerdings, zumindest einige Daten wie Name, E-Mail oder dergleichen abzufragen.
Unser Beispiel wollen wir recht einfach halten und fragen deshalb nur die folgenden 5 Daten ab: Datum, Name, Email-Adresse, Webseite und der Kommentar selbst.
Um dies zu speichern legen wir zunächst die dazu nötige Tabelle in unserer Datenbank an:

CREATE TABLE guestbook (id INT AUTO_INCREMENT PRIMARY KEY, 
  datum DATETIME, name TEXT, mail TEXT, url TEXT, eintrag TEXT);

Schritt 1: Sichtbare Informationen beim ersten Aufruf des Gästebuches

Das Beispiel-Gästebuch zeigt beim ersten Aufruf die das Eingabeformular sowie die Einträge an. Der dazugehörige Bereich des Skriptes sieht so aus:

<?
$db_server = "xxx";
$db_name = "guestbook";
$db_user = "xxx";
$db_passwort = "xxx";
@mysql_connect($db_server,$db_user,$db_passwort);
mysql_select_db($db_name);

if(!isset($_POST['submit1']))
{
 $result = mysql_db_query("guestbook","SELECT * FROM guestbook ORDER BY datum DESC");
 $anzahl = mysql_num_rows($result);
 print('<h1>Gästebuch</h1>
        <form action="gaestebuch.php" method="post">
        <p>Name<br><input type="text" name="name" ></p>
        <p>E-Mail<br><input type="text" name="email"></p>
        <p>Homepage<br><input type="text" name="homepage"></p>
        <p>Kommentar<br><textarea name="comment" cols="40" 
                         rows="6"></textarea></p>
        <input type="submit" name="submit1" value="Eintrag 
         absenden">
        </form>
        <hr> ');
 if($anzahl == 0)
 {
  print('<h3>Noch kein Eintrag im Gästebuch vorhanden</h3>');
 }
 else
 {
  for($i=0;$i<$anzahl;$i++)
  {
   print('<fieldset>
           <legend>Eintrag '.($i+1).' vom 
         '.mysql_result($result,$i,'datum').'</legend>
           <table width="100%">
            <tr><th width="50%">Name:</th>
                <td>'.mysql_result($result,$i,'name').'</td></tr> 
            <tr><th>E-Mail:</th>
                <td>'.mysql_result($result,$i,'email').'</td></tr>
            <tr><th>Webseite</th>
                <td>'.mysql_result($result,$i,'url').'</td></tr>
            <tr><td colspan="2">'.
                mysql_result($result,$i,'eintrag').'</td></tr>
           </table>
          </fieldset>');
  }
 }
}
...

Beim ersten Aufruf des Skriptes ist die Variable submit1 noch nicht existent. submit1 entspricht dem Namen des Submit-Buttons im Eingabeformular - das Formular wurde in diesem Fall also noch nicht abgeschickt. Innerhalb der dazugehörigen If-Schleife werden dann die Einträge des Gästebuchs nacheinander aus der Datenbank geholt und als Tabelle formatiert ausgegeben.

Schritt 2: Neuer Eintrag ins Gästebuch

Der zweite Schritt nimmt an dass der Besucher jetzt alle Felder des Formulares ausgefüllt hat und nun seine Eingaben ins Gästebuch übernehmen möchte. Durch den Klick auf den Button wird der folgende Teil im Skript angesprochen:

...
else
{
 mysql_db_query("guestbook",
 'INSERT INTO guestbook (datum,name,mail,url,eintrag) 
  VALUES (NOW(), "'.$_POST['name'].'", "'$_POST['email'].', 
          '.$_POST['homepage'].', '.$_POST['comment'].')');
 echo '<p>Ihr Eintrag wurde übernommen.</p>';
}
?>

Der zweite Teil des Skriptes ist sehr einfach: Hat der Benutzer das Formular ausgefüllt und abgeschickt, kommt der obige Teil des Skriptes zum Einsatz. Hier werden die übergebenen Parameter nur noch in die Datenbank eingefügt und eine entsprechende Meldung ausgegeben.

Wenn das Skript jetzt verwendet werden soll, müssen
a) beide Bereiche in ein PHP-Skript kopiert (zweiter Bereich NACH dem ersten Bereich) und
b) die entsprechenden Zugangsdaten für den Zugriff auf die MySQL-Datenbank
eingetragen werden.

Schritt 3: Administration des Gästebuches

Es soll ja vorkommen, dass im Gästebuch mal ein Eintrag erscheint, der aus irgendwelchen Gründen "nicht akzeptabel" ist. Aus diesem Grund ist es sinnvoll, eine Möglichkeit zur Verfügung zu haben, wie man solche Einträge wieder - ohne direkten Zugriff auf die Datenbank - entfernen kann.
Der folgende Code zeigt eine Variante, wie unliebsame Einträge wieder aus dem Gästebuch entfernt werden können.

<?
$db_server = "xxx";
$db_name = "guestbook";
$db_user = "xxx";
$db_passwort = "xxx";
@mysql_connect($db_server,$db_user,$db_passwort);
mysql_select_db($db_name);

if(isset($_POST['id']))
{
 $result = mysql_db_query("guestbook",
           'SELECT * FROM guestbook ORDER BY datum DESC");
 print('<form action="administration.php" method="post">');
 print('<h2>Löschen von Einträgen</h2>
        <table border="1">
         <tr><th>Bitte markieren</th>
             <th>Datum</th><th>Name</th><th>Eintrag</th></tr>');
 $num = mysql_num_rows($result);
 for($i=0;$i<$num;$i++)
 {
  print('<tr>
          <td><input type="checkbox" name="id[]" value="'.
              mysql_result($result,$i,'id').'"></td>
          <td>'.mysql_result($result,$i,'datum').'</td>
          <td>'.mysql_result($result,$i,'name').'</td>
          <td>'.mysql_result($result,$i,'eintrag').'</td>
         </tr>');
 }
 print('</table><input type="submit" value="Einträge Löschen">');
}
else
{
 foreach($_POST['id'] as $eintrag)
 {
  $result = mysql_db_query("guestbook",
            'DELETE FROM guestbook WHERE id='.$eintrag);
  if($result == "1")
  {
   print('<p>Eintrag mit der Id '.$eintrag.
         ' wurde gelöscht.</p>');
  }
  {
   print('<p style="color:red;">Eintrag mit der Id '.$eintrag.
         ' konnt nicht gelöscht werden.</p>');
  }
 }
}
?>

Beim Aufruf zeigt das Skript die wichtigsten Informationen aller vorhandenen Einträge im Gästebuch an. Jedem Eintrag ist eine Checkbox zugeordnet.
Mit Hilfe der Checkbox kann der Administrator des Gästebuches entscheiden, welche Einträge gelöscht werden sollen. Es können auch mehrere Einträge gleichzeitig markiert werden.
Nach dem Klick auf den Submit-Button werden die Einträge gelöscht und eine Bestätigungsmeldung wird angezeigt.

Dazu werden zuerst alle Einträge aus der Datenbank zusammen mit ihrer id aufgerufen und im Browser angezeigt. Die jeweilige Id wird der dazugehörigen Checkbox als value zugewiesen. Wichtig dabei ist, dass dem Namen der Checkbox ein "[]" hinzugefügt wird und das alle Checkboxen den gleichen Namen haben. Damit wird bei der Verarbeitung des Formulars automatisch ein Array mit dem Namen der Checkbox angelegt, welches mit den zugewiesenen Werte der Checkboxen (= Id der Datenbankeinträge) gefüllt wird. Bei der Verarbeitung des Formulares wird das Array einzeln ausgelesen und die darin enthaltenen Einträge gelöscht.

Hinweis zu Gästebuch-Spam

Ein Beispiel für Gästebuch-Einträge, die "nicht akzeptabel" sind, sind SPAM-Meldungen. Es gab und gibt immer wieder Menschen, die in Gästebüchern massenhaft Links auf von ihnen beworbene Seiten eintragen, um die Zugriffsrate zu erhöhen. Beim Indizieren der Gästebücher haben die sog. "Robots" der Suchmaschinen früher solche Links mit gespeichert. Mittlerweile kann Gästebuch-SPAM durch zwei Maßnahmen relativ einfach unterbunden werden:

Schritt 1:
Im head-Bereich des Gästebuches wird das Meta-Tag <meta name="robots" content="index, nofollow"> eingetragen. Damit indizieren die Robots der Suchmaschinen zwar das eigentliche Gästebuch, jedoch keinerlei Links innerhalb des Gästebuches.

Schritt 2:
Durch ein Administrations-Skript, wie bereits im Artikel beschrieben, können unliebsame SPAM-Einträge leicht wieder gelöscht werden.

Weiterlesen: ⯈ E-Mails versenden mit PHP

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant