[PHP] Gästebuch mit MySql und Seitenumbrüchen

Drucken
( 7 Votes )
Hauptkategorie: Programmieren Kategorie: PHP
Erstellt am 02.05.2012 Zuletzt aktualisiert am 09.08.2012 Geschrieben von Jonny132
In diesem Tutorial zeige ich euch wie ihr mithilfe von PHP und MySql ein Gästebuch programmieren könnt, welches sich auf mehrere Seiten aufteilt.
Ich werde euch einfach die wichtigsten Blöcke des Codes erklären und am Ende das komplette Beispiel posten. HIER könnt ihr das ganze schonmal produktiv testen.

Was wir benötigen:
  • MySql Tabelle namens 'GUESTBOOK' mit den Feldern
    • ID - INT - AutoIncrement
    • DATUM - TIMESTAMP - Default: CURRENT_TIMESTAMP
    • VON - VARCHAR - Länge: 50
    • NACHRICHT - VARCHAR - Länge: 1000
  • Datei mit dem Namen 'guestbook.php'


MySQL Tabelle GUESTBOOK:

CREATE TABLE IF NOT EXISTS `GUESTBOOK` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `DATUM` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `VON` varchar(50) NOT NULL,
  `NACHRICHT` varchar(1000) NOT NULL,
  PRIMARY KEY (`ID`)
);

guestbook.php CSS - Definition
Natürlich wollen wir das Gästebuch etwas farbig gestalten, dafür habe ich eine Minimale CSS - Definition ausgearbeitet die ihr nach belieben ändern und an eure Bedürfnisse anpassen könnt:
    <style type="text/css">
      #NewMessageHeadline
      {
        color:darkgreen;
        font-size:18pt;
      }
      .MessageFieldDescription
      {
        width: 150px;
        color:green;
        vertical-align:top;
      }
      .MessageInfo
      {
        background-color:lightgreen;
        margin: 0px;
        padding: 3px;
      }
      .Message
      {
        margin: 0px;
        padding: 3px;
      }
      a
      {
        color:darkgreen;
        padding-right:2px;
      }
    </style>

guestbook.php Eintrag speichern:
      if(isset($_POST['name']))
      {
        $name = mysql_real_escape_string(htmlspecialchars($_POST['name']));
        $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
        $insert = mysql_query("INSERT INTO `GUESTBOOK` (`VON`,`NACHRICHT`) VALUES ('$name','$message')");
        if (!$insert)
        {
          die('Eintrag konnte nicht gespeichert werden: ' . mysql_error());
        }
      }
Ganz wichtig hier sind die Funktionen mysql_real_escape_string und htmlspecialchars welche verhindern, dass Schadcode in unser Gästebuch eingeschleust werden kann (Beispielsweise JavaScript). Mithilfe eines einfachen Insert wird ein neuer Datensatz in die Tabelle eingefügt. In diesem Script fehlen noch die überprüfungen ob es sich um einen Leerstring handelt. Diese Arbeit überlasse ich euch.

guestbook.php Eingabe Formular:
    <form method="POST" action="?page= ">
      <span id="NewMessageHeadline">Neuer G&auml;stebucheintrag verfassen:</span> <br />
      <span class="MessageFieldDescription">Name</span><input type="text" name="name" /> <br />
      <span class="MessageFieldDescription">Nachricht</span><textarea cols="16" rows="5"  name="message"></textarea> <br />
      <input type="submit" value="Speichern"/> <br />
    </form>
In der Formulardefinition geben wir dem User die Möglichkeit seinen Namen und sein Gästebucheintrag einzutragen. Der User wird dann automatisch wieder auf die Seite weitergeleitet von der er gekommen ist, wobei zu bedenken ist ob es eventuell besser wäre ihn auf die Startseite des Gästebuches zu leiten, damit er seinen gerade geschriebenen Beitrag auch sieht.

guestbook.php Einträge ausgeben:
      $numMessages = 5;
      $pageNum = 0;
      if(isset($_GET['page']) && is_numeric($_GET['page']))
      {
        $pageNum = $_GET['page'];
      }

      $queryResult = mysql_query("SELECT * FROM `GUESTBOOK` ORDER BY `Datum` DESC LIMIT " . ($pageNum * $numMessages)  . ", " . $numMessages);
      if (!$queryResult)
      {
        die('G&auml;stebucheintr&auml;ge konnten nicht gelesen werden: ' . mysql_error());
      }

      while ($row = mysql_fetch_object($queryResult))
      {
        ?>
        <p class="MessageInfo"><?php echo $row->VON; ?> hat am <?php echo $row->DATUM; ?> geschrieben:</p>
        <p class="Message"><?php echo nl2br($row->NACHRICHT); ?></p>
        <?php
      }
      mysql_free_result($queryResult);

In diesem Block lesen wir zuerst aus auf welcher Seite wir uns befinden, default ist 0.
Im SELECT-Befehl an die MySql-Datenbank schränken wir das Ergebnis mittels LIMIT Befehl ein und erhalten somit nur die Einträge welche wir auf der gewollten Seite sehen wollen. Danach iterieren wir über das Ergebnis der Abfrage und geben es aus. Zu beachten ist die Funktion nl2br, welche uns das nicht sichtbare '\n' (Zeilenumbruch) in ein br-Tag umwandelt.

guestbook.php Ausgabe der Seitennavigation:
      $countResult = mysql_query("SELECT count(*) as `COUNT` FROM `GUESTBOOK`");
      if(!$countResult)
      {
        die('Anzahl der Eintr&auml;ge konnte nicht gelesen werden: ' . mysql_error());
      }

      $count = mysql_fetch_object($countResult);
      for($i=0; $i<=($count->COUNT/$numMessages);$i++)
      {
        echo '<a href="/guestbook.php?page='.$i.'">'.($i+1).'</a>';
      }

 

 

Hier holen wir uns zuerst die Gesamtanzahl der vorhandenen Gästebucheinträge. Diese dividieren wir durch die Anzahl die wir pro Seite anzeigen lassen wollen und erstellen dann die Links.

Ebenfalls interessant sein könnte dieses Tutorial: [PHP] Gästebuch ohne Datenbank.



Komplettes Beispiel: 

<html>
  <head>
    <title>G&auml;stebuch</title>
    <style type="text/css">
      #NewMessageHeadline
      {
        color:darkgreen;
        font-size:18pt;
      }
      .MessageFieldDescription
      {
        width: 150px;
        color:green;
        vertical-align:top;
      }
      .MessageInfo
      {
        background-color:lightgreen;
        margin: 0px;
        padding: 3px;
      }
      .Message
      {
        margin: 0px;
        padding: 3px;
      }
      a
      {
        color:darkgreen;
        padding-right:2px;
      }
    </style>
  </head>
  <body>
    <?php
      $con = mysql_connect('host', 'user', 'passwort');
      if (!$con)
      {
        die('Verbindung schlug fehl: ' . mysql_error());
      }

      $db = mysql_select_db('database', $con);
      if (!$db)
      {
        die('Datenbank konnte nicht ausgew&auml;hlt werden: ' . mysql_error());
      }

      if(isset($_POST['name']))
      {
        $name = mysql_real_escape_string(htmlspecialchars($_POST['name']));
        $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
        $insert = mysql_query("INSERT INTO `GUESTBOOK` (`VON`,`NACHRICHT`) VALUES ('$name','$message')");
        if (!$insert)
        {
          die('Eintrag konnte nicht gespeichert werden: ' . mysql_error());
        }
      }

    ?>

    <form method="POST" action="?page= ">
      <span id="NewMessageHeadline">Neuer G&auml;stebucheintrag verfassen:</span> <br />
      <span class="MessageFieldDescription">Name</span><input type="text" name="name" /> <br />
      <span class="MessageFieldDescription">Nachricht</span><textarea cols="16" rows="5"  name="message"></textarea> <br />
      <input type="submit" value="Speichern"/> <br />
    </form>

    <?php
      $numMessages = 5;
      $pageNum = 0;
      if(isset($_GET['page']) && is_numeric($_GET['page']))
      {
        $pageNum = $_GET['page'];
      }

      $queryResult = mysql_query("SELECT * FROM `GUESTBOOK` ORDER BY `Datum` DESC LIMIT " . ($pageNum * $numMessages)  . ", " . $numMessages);
      if (!$queryResult)
      {
        die('G&auml;stebucheintr&auml;ge konnten nicht gelesen werden: ' . mysql_error());
      }

      while ($row = mysql_fetch_object($queryResult))
      {
        ?>
        <p class="MessageInfo"><?php echo $row->VON; ?> hat am <?php echo $row->DATUM; ?> geschrieben:</p>
        <p class="Message"><?php echo nl2br($row->NACHRICHT); ?></p>
        <?php
      }
      mysql_free_result($queryResult);

      $countResult = mysql_query("SELECT count(*) as `COUNT` FROM `GUESTBOOK`");
      if(!$countResult)
      {
        die('Anzahl der Eintr&auml;ge konnte nicht gelesen werden: ' . mysql_error());
      }

      $count = mysql_fetch_object($countResult);
      for($i=0; $i<=($count->COUNT/$numMessages);$i++)
      {
        echo '<a href="/guestbook.php?page='.$i.'">'.($i+1).'</a>';
      }
    ?>


  </body>
</html>

HIER nochmals das produktive Beispiel.

    Veröffentlichen Sie ihre Kommentare ...