Einfaches Gästebuch

Dieses Beispiel-Gästebuch soll wirklich ganz einfach gehalten sein, es soll nur zeigen, wie ein einfaches Script aufgebaut ist. Es werden keinen Funktionen oder gar Objektorientierung benutzt. Das wäre hier Overkill. Entsprechende Beispiele kommen später noch.

Was muß so ein Gästebuch eigentlich können? Im Prinzip nur vorhandene Einträge anzeigen und neue Einträge entgegen nehmen. Das Speichern der Einträge machen wir hier der Einfachheit halber einmal in einer Datenbank.

Es stellt sich also zuerst die Frage, wie die Tabelle aussehen muß. Was für Informationen müssen denn gespeichert werden? Bei einem einfachen Gästebuch sollen mal der Name des Eintragenden und der eigentliche Text, sowie das Eintragedatum reichen. Daraus läßt sich eigentlich schon unser create table bestimmen.

CREATE TABLE meldung(
  id            int not null primary key auto_increment,
  datum         datetime,
  name          varchar(200),
  eintrag       text
);

Ich habe hier noch eine eindeutige ID eingefügt, damit man einen Eintrag auch später noch eindeutig identifizieren kann.

Nun stellt sich die Frage: Was programmiert man zuerst? Erst die Eingabe oder die Ausgabe? Ohne Daten kann man die Ausgabe nicht testen, aber ohne Ausgabe auch nicht vollständig die Eingabe. Wenn man die Eingabe (Formular und Eintragen in die Datenbank) programmiert, muß man irgendwie überprüfen, ob das Script die Daten auch richtig in die Datenbank schreibt. Das kann man z.B. per geeignetem select am MySQL-Prompt erledigen. Um die Ausgabe zu testen, braucht man natürlich irgendwelche Daten. Auch diese könnte man zum Testen von Hand per passendem insert in die Datenbank schreiben. Dies ist in der Regel jedoch aufwendiger, so daß es sich empfiehlt, erst die Eingabe und dann die Ausgabe zu programmieren.

Wer gut ist, kann natürlich auch beides gleichzeitig programmieren und damit beide Scripte auf einmal testen. Problematisch wird es allerdings im Fehlerfall. Bei unserem Gästebuch zum Beispiel: Nehmen wir an, die Ein-/Ausgabe ist soweit programmiert, aber bei der Ausgabe bleibt das Feld mit dem Kommentar leer. Wo liegt dann der Fehler? Einerseits kann er bei der Eingabe liegen (dann steht nichts in der Datenbank) oder bei der Ausgabe (dann wird der korrekt in der DB stehende Text nicht ausgegeben).

Nun aber zu unserem Script. Als erstes nun die Eingabe. Im Prinzip sollte es durch die Kommentare selbst erklärend sein. Eine nette Spielerei ist die Weiterleitung nach erfolgtem Eintrag. Wie wir jedoch seit Kapitel 11.1.1 wissen, muß die angegebene Adresse absolut sein. Hier werden die von PHP zur Verfügung gestellten Umgebungsvariablen genutzt, um automatisch die aktuelle Adresse zu ermitteln und dorthin weiterzuleiten. Die Alternative wäre gewesen, die Adresse ,,hart`` reinzuschreiben und dann hätte man Probleme, wenn sich die Adresse des Scripts ändert.

<?php
$DBHost   = "localhost";
$DBName   = "reeg";
$DBUser   = "reeg";
$DBPasswd = "super_geheim";

// Verbindug zu DB-Server herstellen
mysql_connect($DBHost, $DBUser, $DBPasswd)
    OR die("Konnte DB-Server nicht erreichen");
mysql_select_db($DBName);

if (isset($_GET["submit"])){
// Der Submit - Button wurde gedrückt
//            -> die Werte müssen überprüft
// und bei Gültigkeit in die DB eingefügt werden

  // wir gehen von der Gültigkeit der Daten aus
  $DatenOK = 1;

  // es gab noch keine Fehlermeldung
  $error = "";

  if (!empty($_GET["name"])){
    // es wurde kein Name eingegeben
    $DatenOK = 0;
    $error .= "Es muß ein Name eingegeben werden<br>\n";
    $daten["name"] = "";
  }
  else {
    $daten["name"] = $_GET["name"];
  }

  if (!empty($_GET["eintrag"])){
    // es wurde kein Kommentar eingegeben
    $DatenOK = 0;
    $error .= "Ein Eintrag ohne Kommentar macht nicht viel";
    $error .= " Sinn, oder?<br>\n";
    $daten["eintrag"] = "";
  }
  else {
    $daten["eintrag"] = $_GET["eintrag"];
  }

  if ($DatenOK){
    // Daten waren OK -> also in DB eintragen
    mysql_query(sprintf('insert into meldung
                                (datum,name,eintrag)
                         VALUES (now(),"%s","%s")',
			addslashes($daten["name"]),
			addslashes($daten["eintrag"])));
    echo mysql_error();

    // Alles eingetragen -> zurück zur Übersicht
    header('Location: http://'.$_SERVER["HTTP_HOST"].
	   substr($_SERVER["PHP_SELF"],0,
		  strrpos($_SERVER["PHP_SELF"],'/'))
	   .'/');
    // und fertig...
    die();
  }

}
else {
  $daten["name"] = "";
  $daten["eintrag"] = "";
}
?>

<html>
<head>
<title>Neuer Eintrag in unser GB</title>
</head>
<body>
<?php
if ($submit && !$DatenOK){
  // Das Formular wurde schon abgeschickt aber die Daten
  //  waren nicht OK
  // -> Fehlermeldung ausgeben
  echo "<h2>Fehler:</h2>\n";
  echo $error;
}

// Formular anzeigen
?>
<form action="<?php echo $_SERVER["PHP_SELF"];?>"
      method="GET">
Name:
<input type="text" name="name" size="30" maxlength="200"
 value="<?php echo $daten["name"]; ?>">
<br>
Text:<br>
<textarea rows="10" cols="50" wrap="virtual" name="eintrag">
<?php echo $daten["eintrag"]; ?>
</textarea>
<br>
<input type="submit" name="submit" value="Absenden">

</body>
</html>

Die Ausgabe ist eigentlich noch einfacher als die Eingabe. Für den ,realen` Einsatz sollte man allerdings z.B. das Datum schöner formatieren und die Tabelle ist auch nicht so toll.


<?php

$DBHost   = "localhost";
$DBName   = "reeg";
$DBUser   = "reeg_ro";
$DBPasswd = "streng_geheim";


// Verbindug zu DB-Server herstellen
mysql_connect($DBHost, $DBUser, $DBPasswd) 
     OR die("Konnte DB-Server nicht erreichen");
mysql_select_db($DBName);

?>

<html>
<head>
<title>Die Eintr&auml;ge in unserem GB</title>
</head>
<body>
<?php

$res = mysql_query('select datum, name, eintrag 
                    from meldung 
                    order by datum desc');
echo mysql_error();

while ($row = mysql_fetch_array($res)){
    echo "<table border=\"1\" width=\"600\">\n";
    printf("<tr><td>Name:</td><td>%s</td></tr>\n",
	   htmlentities($row["name"]));
    printf("<tr><td>Datum:</td><td>%s</td></tr>\n",
	   $row["datum"]);
    printf("<tr><td>Eintrag:</td></tr>\n");
    printf("<tr><td colspan=\"2\">%s</td></tr>\n",
	   nl2br(htmlentities($row["eintrag"])));
    echo "</table>\n";
}
?>
<hr>
<a href="eintrag.php4">neuen Eintrag hinzufügen</a>
</body>
</html>

Das Script in Aktion gibt es auf meiner Homepage http://reeg.net/. Die einzigen Änderungen wurden am Layout vorgenommen.

Christoph Reeg