Zudila AG

Webseiten-Erstellung
Webseiten-Programmierung
Webseiten-Wartung
8057 Zürich
Tel: +41 44 310 14 25
Fax: +41 44 310 14 26
Mob: +41 79 691 87 58
vCard, Skype: juergzuerich

PHP & MySQL: Gästebuch v1.4



Browser: Firefox!
Umfrage

Hat Ihnen dieses Script geholfen?

ja

teilweise

wenig

nein



Watchmouse Logo

Gästebuch, Funktion

Auf vielen Webseiten wird gerne ein Gästebuch geführt, um so eine bessere "Kundenbindung" zu erzielen.
Oft werden jedoch absolut inakzeptable Eintragungen vorgenommen, dagegen wird bei jeder Eintragung dem Webmaster ein Kontrollmail zur Prüfung zugesendet.
Die Eintragungen kö;nnen so allenfalls nachträglichen gelöscht werden.
An die allenfalls eingegebene Absender-E-Mail-Adresse wird ein Bestätigungsmail gesendet, so dass der Inhaber der Adresse gegebenenfalls über falsche Eintragungen informiert wird und die Löschung verlangen kann.
Die Absender-E-Mail-Adresse wird optional auch in eine Newsletter Datenbank-Tabelle gespeichert.
Zusätzlich wird es verunmöglicht Tags einzufügen, diese werden in der Regel nur für Werbung zweckentfremdet (Links, fett etc.).
Die neuste Eintragung erscheint immer zuoberst.


Für die Programmierung des Gästebuches benötigen wir zwei Dateien und eine Datenbanktabelle.

Als erstes erstellen wir, am Besten mit phpMyAdmin, in der MySQL-Datenbank unsere Tabelle mit einem Datensatz.
Das Programm phpMyAdmin ist bei den meisten Providern bereits installiert und hilft uns, unsere Datenbank zu warten.

In phpMyAdmin öffnen wir die Seite SQL. Nun kopieren wir den Inhalt des gesamten untenstehenden Scripts in das Feld SQL und drücken OK. Dadurch erstellt phpMyAdmin die benötigte Tabelle.
Anschliessend sollte gleich geprüft werden, ob die Tabelle "gaestebuch" auch erstellt wurde und sich der eine Datensatz in der Tabelle befindet.

Generell: es ist immer besser, zuerst die Tabellen zu erstellen. Auch einen ersten Datensatz sollte immer gleich in die Tabellen, um so die php-Skripte einfach auf ihre Funktion prüfen zu können.


Code MySQL - Datenbank

PHP:Gästebuch v1.4, MySQL - Datenbank

  1. # Tabellenstruktur für Tabelle `gaestebuch`
  2.  
  3. CREATE TABLE `gaestebuch` (
  4.   `id_gaesteb` int(12) NOT NULL AUTO_INCREMENT,
  5.   `vname` varchar(40) DEFAULT NULL,
  6.   `nname` varchar(40) NOT NULL DEFAULT '',
  7.   `ort` varchar(40) DEFAULT NULL,
  8.   `email` varchar(40) DEFAULT NULL,
  9.   `beitrag` text NOT NULL,
  10.   `tstamp` timestamp(14) NOT NULL,
  11.   PRIMARY KEY (`id_gaesteb`)
  12. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  13.  
  14. # Daten für Tabelle `gaestebuch`
  15.  
  16. INSERT INTO `gaestebuch`
  17. (`id_gaesteb`, `vname`, `nname`, `ort`, `email`, `beitrag`, `tstamp`)
  18. VALUES (1, 'Testerli', 'Tester', 'Testdorf', 'test@test.xy', 'Dies ist ein Testtext, der immer hier steht.\r\nEr dient nur zum Zeigen der Funktion.', 20040924124140);
  19.  
Script Update: 29.04.08  

Erklärungen zum Code

Zu den Zeilen:

1: Hier steht als Kommentar der Inhalt dieses Scriptes. Dieser könnte auch weggelassen werden.

3 - 12: Die Definition unserer Tabelle

4: Die ID wird festgelegt, zudem wird angeben, dass diese sich selbst vergibt mittels einem Zähler (auto_increment).
Es empfiehlt sich, für die ID nie nur "id" zu verwenden, sondern immer einen Namen zu vergeben, der zur Tabelle passt. Denn, wenn mehrere Tabellen verwendet werden sollten, könnte es leicht zu Verwechselungen kommen.

5: Es folgt das Feld "vname" mit dem Vornamen. Dieses Feld ist 40 Zeichen lang und muss keinen Inhalt haben.

6 - 8: Es folgen der Nachname, das Ort und die E-Mail-Adresse.

9: Es kommt der eigentliche Gästebucheintrag, wir haben den Feldtyp "text" verwendet, was 65535 Zeichen zulassen würde. Man könnte auch den Feldtyp "tinytext" verwenden, dies würde jedoch nur 255 Zeichen zulassen.

10: Mit "timestamp" wird das Speicherdatum des Beitrages festgehalten.


Nun erstellen wir mit einem Editor eine Datei "gaestebuch.php" und fügen folgendes Script ein:
Einige Stellen müssen angepasst werden, siehe Text.


Code Gästebuch

Erklärungen zum Code

Zu den Zeilen:

1 - 6: Hier der nicht vollständige head-Teil. Dazu kann der Quelltext dieser Seite betrachtet werden.

5: Hier fügen wir das JavaScript ein, das uns den Mauszeiger in das Feld Nachname stellt. Eine Funktionalität die nicht zwingend erforderlich ist. Wir benötigen daraus nur die Funktion "startnname()". Das Script unter: formpruef-de.js

8: Nun eröffnen wir den body-Teil. Mit "onload" aktivieren wir mit dem eingebundenen JavaScript die Funktion um den Mauszeiger in das Feld Nachname zu bringen.

11: Jetzt inkludieren wir den Zugang zu unserer Datenbank. Dieser sollte immer in einer eigenen Datei sein, um so bei einer Änderung der Zugangsdaten diesen nur an einem Ort anzupassen.
Beispiel: inc.php

12: Die ausgelagerten Funktionen werden eingebunden. Wir benötigen nur die Überprüfung der E-Mail-Adresse.

15 - 16: Wir setzen alle Variablen auf NULL, die wir in der nachfolgenden if-Anweisung allenfalls ändern.

19: Formulare können gespamt werden, um dies zumindest teilweise zu verhindern, geben wir dem Formular eine dauernd ändernde Nummer mit.
Zur Bildung der Nummer verwenden wir Primzahlen und die Zeit.

21 - 94: Es folgt der Teil, der ausgeführt wird, wenn wir das Formular abschicken.

24 - 27: Mit $_POST[' '] werden die Variablen aus dem Formular übernommen und auf ihre Maximallänge überprüft. Sollten die Variablen länger sein, so wurde getrickst und wir brechen sofort ab!

29: Wir prüfen, ob die in Zeile 19 generierte Nummer auch richtig ist. Ist diese falsch, so wird der ganze Abauf mit "die" gleich gestoppt.

32 - 36: Wir entfernen aus allen Eingabefeldern allenfalls vorhandene Tags, mit der Funktion "strip_tags". So ist es nicht möglich irgendwelche Formatierungen (fett, unterstrichen) oder funktionsfähige Links in die Felder einzugeben.
Diese werden meist nur für Werbung missbraucht.
Zudem, Formularfelder sind sonst offene Tore fü Hacks!
Mit der Funktion "trim" werden die allenfalls vorhandenen Leerschläge am Anfang und Ende entfernt.
Mit der Funktion "strtr" werden die allenfalls vorhandene weitere Zeichen durch Leerstellen ersetzt.

39: Sollten im Beitrag Worte mit mehr als 50 Zeichen eingegeben werden, so wird automatisch ein Zeilenumbruch eingefügt, um zu verhindern, dass dadurch die Webseitendarstellung verschlechtert wird.

41: Zu oft werden zwischen den Wörtern zuviele Leerstellen eingegeben, wir versuchen dies zu verbessern, indem immer automatisch aus zwei Lerstellen nacheinander nur eine gebildet wird.

44 - 52: Wir prüfen, ob die Pflichtfelder auch ausgefüllt wurden.
In den Variablen die mit "t_" beginnen werden die Fehlermeldungen gespeichert. Sind keine Fehler vorhanden, ist die Variable NULL.

47 - 51: Nun prüfen wir als Erstes, ob eine E-Mail-Adresse eingegeben wurde, falls ja, prüfen wir diese mit der eingebundenen Funktion "check_email". Diese Funktion haben wir in Zeile 12 eingebunden.
Näheres zur Funktion unter: E-Mail Prüfung

55 - 93: Die Mails werden versendet und der Datenbankeintrag vorgenommen, sofern die Bedingungen in Zeile 55 erfüllt sind.
Sind die Bedingungen nicht erfüllt, so folgt gleich Zeile 97, das Formular wird mit den eingetragenen Werten und den Fehlermeldungen ausgegeben.

57 - 78: Die Mails werden generiert.

57 - 62: Der "header" der Mails wird formatiert. Die Mailadresse ist anzupasse!
Sollten sich Probleme mit dem Versenden der Mails ergeben, so muss wahrscheinlich dieser Bereich angepasst werden. Fragen Sie allenfalls Ihren Provider.

64 - 68: Nun erstellen wir den Text, der an den Webmaster gesendet wird.

69: Der Text wird zusammengefügt.

71: Das Mail an den Webmaster wird versendet.
Das @ vor "mail" dient dazu, allfällige Fehlermeldungen zu unterdrücken.

73 - 78: Wir senden, sofern eine E-Mail-Adresse eingetragen wurde, ein Bestätigungsmail an den Verfasser des Gästebucheintrages.
Das Zusammensetzen und Versenden des Mails erfolgt wie oben.

81 - 83: Wir fügen den Gästebucheintrag in die MySQL-Datenbank ein.

85: Möchten wir, dass der Eintrag auch für den Newsletterversand erfolgt, so fügen wir folgendes hier ein:

PHP:Gästebuch v1.4, Newsletter-Teil

  1.     // Eintraege an DB newsletter senden
  2.     $query = "INSERT into newsletter (vname,nname,ort,email)
  3.    VALUES('$vname','$nname','$ort','$email')";
  4.     $result = mysql_query($query, $conn) or mysql_die();
  5.  
Script Update: 14.03.07  

Zusätzlich muss natürlich auch in der MySQL-Datenbank eine weitere Tabelle eingefügt werden. Prinzipielle können wir das gleiche Script verwenden wie zu Erstellung des Gästebuches. Zu ändern ist: in Zeile 3 und 16 der Name in "newsletter", in Zeile 4 und 16 die "id_gaesteb" in z.B. "id_newsl", die Zeile 9 wird entfernt und in den Zeilen 16 und 17 wird der Beitrag entfernt.

87 - 89: Wir bestätigen den korrekten Eintrag.

92: Wir leeren alle Variablen die den Inhalt der Gästebucheintragungen enthalten, um so das Formular nun leer anzeigen zu lassen.

98 - 144: Es folgt das Formular. Als erstes legen wir die übliche Übergabemethode fest (method="post"), dann was zu geschehen hat, wenn wir das Formular absenden. Mit php bestimmen wir, dass die selbe Seite erneut aufgerufen wird. Die Angabe "name="meldung"" benötigen wir für das JavaScript, das uns den Mauszeiger in das erste Feld stellt.

Nun werden die einzelnen Formularteile gefüllt, betrachten wir beispielhaft das erste Feld.
107: Wir definieren den Feldtyp (text), geben ihm den als Variable zu übergebenden Namen (nname), die angezeigte Grö;sse (size="40") und die Maximalgrösse (maxlength="50"), welche nicht grö;sser als das entsprechende MySQL-Feld sein dürfen, die Reihenfolge wie wir das Formular mit Tabulator durchschreiten legen wir mit "tabindex" fest. Mit "value" und php erfolgt die Anzeige des bereits eingegebenen Feldinhaltes.
Die Felder sollten immer so gross sein, dass ein Eintrag auch effektiv möglich ist, ohne zu scrollen.

108: Es erscheint allenfalls die entsprechende Fehlermeldung. Ist kein Fehler vorhanden, ist die Variable NULL und somit erscheint auch keine Anzeige.
Die Stylesheet-Angabe "class="rot"" zeigt den Text in rot. Das für alle unsere Seiten verwendete CSS ist unter CSS zu finden.
Der Leerschlag hinter den $t_...-Variablen dient nur dazu, das ganze Script Valid zu halten.

139: Der Code wird dem Formular mitgegeben.

140: Wir versenden das Formular.

152: Wir selektieren unsere Gästebucheinträge.
Mit "DATE_FORMAT(tstamp,'%d.%m.%y') AS tstamp_f" veranlassen wir MySQL unser Datum gleich umformatiert in TT.MM.JJ auszugeben.
Mit "tstamp DESC" wird nach Datum absteigend sortiert, so dass der neuste Eintrag zu oberst erscheint.

154: Die Anzahl Datensätze wird errechnet.

156 - 181: Die Schlaufe wird nun so oft durchlaufen, bis alle Eintragungen angezeigt sind.

179: Die php-Funktion "nl2br" wandelt die Zeilenumbrüche aus der Datenbankeintragung in korrekten HTML-Code um.

182: Wir schliessen die Verbindung zur Datenbank.

188 - 191: Die auf der Seite selbst nicht angezeigte Quellenangabe, ist nicht nur die Bedingung zur freien Nutzung dieses Skriptes, sondern ermöglicht auch in Zukunft, allenfalls benötigte Hilfe zu erhalten.


Nun ist das Gästebuch bereits funktionsfähig.
Die meisten Gästebucheintragungen werden nur Unsinn beinhalten. Um diese unliebsamen Eintragungen zu entfernen, könnte dies mit Hilfe von phpMyAdmin direkt in der Datenbank erfolgen. Schöner ist es jedoch, wenn wir dazu eine eigene Admin-Seite erstellen.
Diese Webseite sollte nur dem Administrator zugänglich sein.


Code Gästebuch löschen

PHP:Gästebuch löschen v1.4

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html>
  4. <head>
  5. <meta name="robots" content="noindex, nofollow" />
  6. </head>
  7.  
  8. <body>
  9.  
  10. <?php
  11. include ("../sicher/inc.php");
  12.  
  13. if (isset($_POST['submit'])) {
  14.   $id_gaesteb = trim(strip_tags($_POST['id_gaesteb'])) ;
  15.   $query = "DELETE FROM gaestebuch WHERE id_gaesteb = '".$id_gaesteb."' " ;
  16.   $result = mysql_query($query,$conn);
  17. }
  18. ?>
  19.  
  20. <h3>G&#228;stebuch</h3>
  21.  
  22. <?php
  23. // Verbindung mit db fuer Eintraege anzeigen
  24. $query = "SELECT *, DATE_FORMAT(tstamp,'%d.%m.%y') AS tstamp_f
  25. FROM gaestebuch ORDER BY tstamp DESC";
  26. $result = mysql_query($query,$conn);
  27. $num = mysql_num_rows($result);
  28.  
  29. for ($i = 0; $i < $num; $i++){
  30.   $row = mysql_fetch_array($result);
  31.   $id_gaesteb = $row['id_gaesteb'];
  32.   echo '
  33. <table width="100%">
  34.  <colgroup>
  35.    <col width="60" />
  36.    <col />
  37.    <col width="50" />
  38.    <col width="150" />
  39.    <col width="70" />
  40.  </colgroup>
  41.  <tr>
  42.    <td>Name:</td>
  43.    <td>'.$row['vname'].' '.$row['nname'].'</td>
  44.    <td>Ort:</td>
  45.    <td>'.$row['ort'].'</td>
  46.    <td rowspan="2">
  47.      <center>
  48.      <form action ="'.htmlspecialchars($_SERVER['PHP_SELF']).'" method ="post">
  49.         <input type="hidden" name="id_gaesteb" value="'.$id_gaesteb.'" />
  50.         <input class="kl" type="submit" name="submit" value="l&#246;schen" />
  51.      </form>
  52.      '.$id_gaesteb.'
  53.      </center>
  54.    </td>
  55.  </tr>
  56.  <tr>
  57.    <td>Mail:</td>
  58.    <td>'.$row['email'].'</td>
  59.    <td>Date:</td>
  60.    <td>'.$row['tstamp_f'].'</td>
  61.  </tr>
  62. </table>
  63. <p class="bgweiss">'.nl2br($row['beitrag']).'</p>
  64.  ';
  65. }
  66. mysql_close($conn);
  67. ?>
  68.  
  69. <!--
  70. Quelle Script: http://www.zudila.ch/scripte/php_gaestebuch.php
  71. Zudila Gästebuch v1.4, GPL
  72. -->
  73.  
  74. </body>
  75. </html>
  76.  
Script Update: 29.04.08  

Erklärungen zum Code

Dieses Script hat mit dem eigentlichen Gästebuch viel gemeinsam. Wir gehen nun nur auf die neuen Teile ein.

4: Wir teilen den Suchmaschinen mit, dass wir keine Indizierung dieser Seite wünschen.

13 - 17: Es erfolgt das Löschen des Datensatzes mit der entsprechenden ID, sofern ein Löschbutton angeklickt wurde.
Wenn ein Datensatz gelöscht wurde, wird dieselbe Seite gleich erneut angezeigt.

48 - 51: Wir fügen ein Formular ein, das nur aus einem Button besteht.
Mit "hidden" geben wir die ID des zu löschenden Datensatzes mit.

66: Wir schliessen die Verbindung zur Datenbank.


Die Datei zum Löschen der Gästebucheintragungen muss geschützt werden, um so zu verhindern, dass jedermann die Eintragungen löschen kann.
Dazu gibt es prinzipiell drei Möglichkeiten:

1. Die Datei bekommt einen möglichst komplizierten Namen und wird von keiner anderen Seiten verlinkt.
Damit ist die Wahrscheinlichkeit relativ klein, dass unbefugte auf die Seite gelangen. Die Seite ist jedoch prinzipiell ungeschützt.

2. Die Datei liegt in einem .htaccess geschützten Bereich. Somit ist der Zugang nur mit Benutzername und Kennwort möglich. Die Seite ist damit gut geschützt.

3. Die Datei wird in einem Admin-Bereich mit einer Session geschützt. Die Seite ist gut geschützt.

Generell: Admin-Seiten sollten nie per Link von den normalen Seiten aus zugänglich sein! Also keine Verlinkung.
Sie finden in unserer Navigation "Intern". Das dient als Beispiel dazu, wie ein Bereich mit .htaccess geschützt werden kann.

Vielleicht hat Ihnen unser Skript ein paar Stunden Arbeit erspart?

Copyright © 1998 - 2008, Zudila AG, CH 8057 Zürich Diese Seite (www.zudila.ch/scripte/php_gaestebuch.php) wurde aktualisiert: 23.10.08

Besucher heute: 3 Seitenaufrufe heute: 6 gerade online: 1
Besucher gestern: 224 Seitenaufrufe gestern: 706 max. online: 135
Besucher pro Tag: 214,47 Seitenaufrufe pro Tag: 752,24 Eigene Seitenaufrufe: 1
Valid XHTML 1.0! Valid CSS! Valid WCAG 1.0, WAI-AAA! ICRA Best viewed with any browser

www.zudila.ch info@zudila.ch

nach oben
Herr Jürg Dieter Lüthard Jürg D. Lüthard Zudila AG www.zudila.ch Krokusweg 6 Switzerland 8057 Zürich Zürich +41 44 310 14 25 +41 79 691 87 58 +41 44 310 14 26
N 47º 24.2416 O 8º 32.9866
business Webseiten erstellen, programmieren, warten /
Web pages provide, program, wait /
Les pages Web fournissent, programment, attendent