PHP/Gästebuch

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Das Gästebuch ist eine typische Anwendung. Die vorliegende Lösung hat die folgende Mysql-Tabelle "guestbook" innerhalb der bestehenden Datenbank "php5test" als Grundlage.

## Name     myguestbook.sql
##
DROP TABLE IF EXISTS guestbook;
CREATE TABLE guestbook (   
  id       int(8)                 NOT NULL AUTO_INCREMENT,   
  name     varchar(30)            NOT NULL,   
  email    varchar(30)            NOT NULL,   
  job      varchar(30) DEFAULT "" NOT NULL,   
  location varchar(30) DEFAULT "" NOT NULL,   
  comments text        DEFAULT "" NOT NULL,   
  url      varchar(50),   
  PRIMARY KEY (id)   
);

Das Gästebuch benötigt die folgenden Funktionen:

  • Add: Anzeige des Formulars zum Hinzufügen eines neuen Eintrags.
  • Send: Eintragen des Formularinhalts in die Datenbank.
  • View: Anzeige des aktuellen Gästebuchs, wenn keine andere Option gewählt wurde.
  • Standard (ohne Auswahl): Anzeige einer Übersicht mit der Anzahl der Einträge und den Befehlen als Hyperlinks.
<?php
## Datenbank verbinden
include("open.inc.php");

## Die Steuerungsvariable "$cmd" wird per GET oder POST gesendet und
## darum aus dem Universalarray "$_REQUEST" entnommen.
$cmd = isset($_REQUEST['cmd']) ? $_REQUEST['cmd'] : "";
switch ($cmd)
{
  ## Wenn ein neuer Eintrag gemacht werden soll, wird das entsprechende
  ## Formular angezeigt. Über das versteckte Feld "cmd" erfolgt dann der
  ## Übergang zum Befehl ""Send".
  case "add":
    echo <<<GUESTFORM
    <p>Bitte teilen Sie uns hier Ihre Meinung mit.</p>
    <p><form  name="guestbook" action="{$_SERVER['PHP_SELF']}" method="post">  
         <input type="Hidden" name="cmd" value="send"/>
         <table border="0">
           <tr>
             <td>Ihr  Name</td>
             <td><input type="text" name="name"/></td>
           </tr>
           <tr>
             <td>Ihre E-Mail Adresse</td>
             <td><input type="text" name="email"/></td>
           </tr>
           <tr>
             <td>Ihre Homepage</td>
             <td><input type="text" name="url"/></td>
           </tr>
           <tr>
             <td>Ihr Job</td>
             <td><input type="text" name="job"/></td>
           </tr>
           <tr>
             <td>Ihr Wohnort</td>
             <td><input type="text" name="location"/></td>
           </tr>
           <tr>
             <td>Kommentare</td>
             <td><textarea name="comments" cols="60" rows="6"></textarea></td>
           </tr>
           <tr>
             <td></td>
             <td><input type="submit" value="Absenden"/><input type="reset" value="Löschen"/></td>
           </tr>
         </table>
       </form>
GUESTFORM;
    ## Anzeige nach dem eigenen Eintrag
    break;
  ## Anzeige der Einträge als fortlaufende Liste, wobei die neuesten
  ## Einträge zuerst angezeigt werden.
  case "view":
    echo "<h2>Anzeige der Einträge</h2>";
    ## Datenbank abfragen
    $result  =  mysql_query("SELECT * FROM guestbook ORDER BY id DESC", $connection);
    ## Datensätze holen
    while  ($row = mysql_fetch_row($result)) 
    {
      echo <<<ENTRY
      <hr>
      <b>Eintrag:</b>   $row[0]<br />
      <b>Name:</b>      $row[1]<br />
      <b>E-mail:</b>    <a href="mailto:$row[1]">$row[2]</a><br />
      <b>Homepage:</b>  <a target="_blank" href="$row[3]">$row[3]</a><br />
      <b>Job:</b>       $row[4]<br />
      <b>Aus:</b>       $row[5]<br />
      <b>Kommentar:</b> $row[6]<br />
ENTRY;
    }
    break;
  ## Falls ein neuer Eintrag abgesendet wurde, wird die passende 
  ## SQL-Anweisung erstellt und an die Datenbank geschickt. Die Felder
  ## werden hier ohne weitere Prüfung übernommen.Die Übernahme der 
  ## Werte aus dem Array "$_POST" erfolgt mit der Funktion "extract".
  case "send":
    extract($_POST);
    $comments = addslashes($comments);
    $strQuery = "INSERT into guestbook (name, email, url, job, location, comments) 
                 VALUES (\"$name\", \"$email\", \"$url\", \"$job\", \"$location\", \"$comments\")";
    $result   = @mysql_query($strQuery, $connection);
    if ($result !== FALSE) 
    {
      echo "<p>Danke! Wir werden Ihren Beitrag berücksichtigen</p>";
    }
    break;
  ## Ohne Auswahl eines Befehls wird die Startseite angezeigt, wo
  ## unter anderem die Anzahl der Einträge zu sehen ist.
  default:
    ## Zuletzt wird die Anzahl der Datensätze ermittelt und zur Hauptseite
    ## zurückverwiesen
    $result = mysql_query("SELECT COUNT(*) FROM guestbook");
    $row    = @mysql_fetch_row($result);
    ## Falls die Abfrage beim ersten Aufruf der Seite misslingt, fehlt
    ## vermutlich die Tabelle, die dann automatisch angelegt wird.
    if (mysql_errno() == 1146)
    {
      echo "Information: " . mysql_error($connection);
      $create  = file_get_contents("data/myguestbook.sql");
      $queries = preg_split('|;|', $create, 2);
      foreach ($queries as $query)
      {
        mysql_query(trim($query), $conn);
        echo mysql_error();
      }
      $entry = "Datentabelle neu erzeugt.<br />Es sind zur Zeit keine Beiträge";
    }
    ## War die Tabelle bereits vorhanden, so wird die Anzahl der Datensätze
    ## ermittelt und (grammatikalisch richtig) die entsprechende Ausgabe erzeugt.
    else
    {
      $num = (int) $row[0];    
      if ($num == 0) 
      {   
        $entry = "Es sind zur Zeit keine Beiträge";
      }
      elseif ($num == "1") 
      {
        $entry = "Es ist zur Zeit ein Beitrag";   
      } 
      else 
      {   
        $entry = "Es sind zur Zeit $num Beiträge";   
      }   
    }
    echo <<<LINKS
    <h2>Willkommen in unserem Gästebuch</h2>
    <p>$entry im Gästebuch.</p>
    <a href="{$_SERVER['PHP_SELF']}?cmd=add">Einen Beitrag hinzufügen</a><br />
    <a href="{$_SERVER['PHP_SELF']}?cmd=view">Beiträge ansehen</a><br />
LINKS;
}
## Für alle Fälle wird ein Link zur Startseite am Seitenende erzeugt.
echo <<<ACCEPTED
    <p><a href="{$_SERVER['PHP_SELF']}">Zurück zur Startseite des Gästebuches</a></p>
ACCEPTED;
?>

Das Gästebuch in der vorliegenden Form ist lediglich Ausgangspunkt für eine vollständige Lösung. Zu erledigende Punkte für eine produktive Lösung wären:

  • Gestaltung mit Stylesheets.
  • Verwaltung zum Entfernen unerwünschter Beiträge.
  • Einführung einer Feldprüfung, um leere oder sinnlose Werte abzulehnen.
  • Nachricht per E-Mail an den Systemverwalter, dass ein neuer Eintrag vorliegt.