Du bist hier: Downloads > Programme von mir > PHP: Gästebuch

Gästebuch mit PHP


Infos

Ein eigenes Gästebuch mit PHP zu realisieren ist ganz einfach. Ich stelle hier die Version vor, welche ich auch bei sveni.com verwende. Sie besteht aus zwei Komponenten. Einmal dem Eingabescript (PHP) und dann der Datei, wo die Einträge drin landen (HTML).

guestbook.htm

<html>
<head>
    <title>Gästebuch</title>
</head>
<body bgcolor="#ffffff" text="#000000">

<p><a href="guestbook.php">Dein Eintrag in das Gästebuch</a></p>

<hr size="1" noshade="noshade" />

<!-- begin -->

</body>
</html>

Oben ist der Aufbau der HTML Datei dargestellt. Im Grunde enthält sie nur einen Link auf die guestbook.php und dann noch die wichtige Kommentarzeile mit dem begin. Hinter dieser Zeile werden dann die einzelnen Gästebucheinträge eingefügt. Man kann das Design dieser Datei beliebig anpassen. Wichtig ist eben nur, dass die Zeile mit dem begin bestehen bleibt. Dieses Kommentar darf nicht verändert werden!

Wenn Ihr das Gästebuch verwendet, müsst ihr auf diese Datei linken.

guestbook.php

Die guestbook.php hat im Grunde zwei Modi. Je nachdem, in welchem Modus es aufgerufen wird, kann es einmal das Eingabeformular anzeigen oder den Gästebucheintrag hinzufügen.

<html>
<head>
  <title>Gästebuch</title>
</head>
<body bgcolor="#ffffff" text="#000000">

<span class="font1">

<h1>Gästebuch</h1>

<?php

#version: 1.00.03
#date:    02.01.2005

import_request_variables('gp', 'i_');

global $i_action, $i_name, $i_mail, $i_url, $i_comment;

$wdays= array('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag',
    'Freitag', 'Sonnabend', 'Sonntag');
$month= array('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli',
    'August', 'September', 'Oktober', 'November', 'Dezember');

//sendet eine mail ab
function send_info_mail($comment,$name,$mail) {
    global $name;
//    mail('"Name" <mail@domain.com>', 'Betreff', $comment, "From: \"$name\" <$mail>\n");
}

if ($i_action == 'send') {
    if (($i_name) || ($i_mail) || ($i_url) && ($i_comment)) {
        $comment = stripcslashes($comment);
        $f=file('guestbook.htm');
        $file = fopen ("guestbook.htm", "w");
        for ($i=0;$i<count($f);$i++) {
            $f[$i]=chop($f[$i]);
            $pos = strpos ($f[$i], "<!-- begin -->");
            if ($pos !== false) {
                fwrite($file,$f[$i]."\n");
                fwrite($file,"\n<!-- neuer Eintrag -->\n\n");
                if ($i_name) {
                    fwrite($file,"<b>Name:</b> $i_name<br />");
                }
                if ($i_mail) {
                    fwrite($file,"<b>E-Mail:</b> <a href=\"mailto:$i_mail\">".
                        $i_mail</a><br />");
                }
                if ($i_url) {
                    if (substr($i_url,0,7) != 'http://') {
                        "$i_url='http://'.$i_url;
                    }
                    fwrite($file,"<b>URL:</b> <a href=\"$i_url\" target=\"_blank\">".
                        "$i_url</a><br />");
                }
                $timeArray = localtime();
                $timeArray[5]+=1900; #year
                $date = sprintf ("%02d:%02d:%02d",$timeArray[2],$timeArray[1],$timeArray[0]);
                $date = $wdays[$timeArray[6]].', '.$timeArray[3].'. '.$month[$timeArray[4]].' '.
                    $timeArray[5].', um '.$date;
                fwrite($file,"<b>Datum:</b> $date<br>");
                send_info_mail($comment,$name,$mail);
                $i_comment = preg_replace ("/\n/", '<br>', $i_comment);
                fwrite($file,"<b>Kommentar:</b> <p>$i_comment</p>".
                    "<hr size=\"1\" noshade=\"noshade\" />\n");
            } else {
                fwrite($file,$f[$i]."\n");
            }
        }
        fclose($file);
    }
    print "<p>Vielen Dank für Deinen Eintrag in meinem Gästebuch.<br />";
    print "<a href=\"guestbook.htm\">Hier kannst Du Dir Deinen Eintrag anschauen</a>.</p></p>";
} else {
    $str = <<<EOD

    <p>Hier kannst einen Eintrag im Gästebuch hinterlassen.</p>

<form method=POST action="guestbook.php?action=send" name="sdf">

<table>
<tr valign=top>
    <td>Name: </td>
    <td><input size="60" name="name"></td>
</tr>
<tr valign=top>
    <td>E-Mail: </td>
    <td><input size="60" name="mail"></td>
</tr>
<tr valign=top>
    <td>URL: </td>
    <td><input size="60" name="url"></td>
</tr>
<tr valign=top>
    <td>Kommentar: </td>
    <td><textarea name="comment" rows="8" cols="60" wrap="virtual"></textarea></td>
</tr>
</table>

<br><input type="submit" value=" Eintragen ">
</form>

EOD;
    print $str;

}

?>

</body>
</html>

Alles klar? grins Ne eher nicht. Aber keine Angst erkläre nun auch Stück für Stück was da abgeht. Ein bisschen Ahnung von programmieren sollte man aber schon haben.

<?php

#version: 1.00.03
#date:    02.01.2005

import_request_variables('gp', 'i_');

global $i_action, $i_name, $i_mail, $i_url, $i_comment;

Das HTML am Anfang muss ich, denke ich, wohl nicht erklären. Da passiert auch im Grunde nix. Hier sehen wir also den Anfang des Scriptes. Als erstes kommen zwei kleine Kommentarzeilen, welche nur sagen, welche Version das Programm ist und wann es zuletzt bearbeitet wurde. Jaja ist noch recht frisch Smiley glücklich

Die Funktion import_request_variables sorgt dafür, dass alle übergebenen Parameter auch als Variablen zur Verfügung stehen. Diesen wird immer ein "i_" vorangesetzt. Bei einem Aufruf von guestbook.php?param=test hätten wir also eine Variable $i_param zur Verfügung, in der "test" stehen würde. In früheren Versionen von PHP standen alle Variablen automatisch unter dem gleichen Namen zur Verfügung. Es hätte also eine Variable $param existiert. Da dies aber eine Sicherheitslücke darstellt (man könnte damit ja gezielt Variablen im Programm überschreiben), wurde dieses neue Konstrukt vor kurzem eingeführt.

Danach stellen wir mit global sicher, dass auch alle unsere Variablen belegt sind.

$wdays= array('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag',
    'Freitag', 'Sonnabend', 'Sonntag');
$month= array('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli',
    'August', 'September', 'Oktober', 'November', 'Dezember');

//sendet eine mail ab
function send_info_mail($comment,$name,$mail) {
    global $name;
//    mail('"Name" <mail@domain.com>', 'Betreff', $comment, "From: \"$name\" <$mail>\n");
}

Wir legen zwei Arrays an, welche alle Wochentage und Monate enthalten. Dies ist, damit wir später das Datum schöner formatieren können. Und da wir ja ein komfortables Gästebuch wollen, soll es uns ja auch eine E-Mail schicken, damit wir immer sofort Bescheid wissen, wenn wir einen neuen Eintrag haben. Wenn wir dann noch einen Service haben, welcher uns per SMS über neue E-Mails informiert, wissen wir immer sofort, wenn wir einen neuen Gästebucheintrag haben. Das nenn ich Komfort! Smiley glücklich

Die E-Mail Zeile muss dann noch auskommentiert werden (die // wegmachen) und "Name" <mail@domain.com> durch Eure E-Mail Adresse ersetzt werden.

if ($i_action == 'send') {
    if (($i_name) || ($i_mail) || ($i_url) && ($i_comment)) {
        $comment = stripcslashes($comment);
        $f=file('guestbook.htm');
        $file = fopen ("guestbook.htm", "w");
        for ($i=0;$i<count($f);$i++) {
            $f[$i]=chop($f[$i]);
            $pos = strpos ($f[$i], "<!-- begin -->");
            if ($pos !== false) {
                fwrite($file,$f[$i]."\n");
                fwrite($file,"\n<!-- neuer Eintrag -->\n\n");
                if ($i_name) {
                    fwrite($file,"<b>Name:</b> $i_name<br />");
                }
                if ($i_mail) {
                    fwrite($file,"<b>E-Mail:</b> <a href=\"mailto:$i_mail\">".
                        $i_mail</a><br />");
                }
                if ($i_url) {
                    if (substr($i_url,0,7) != 'http://') {
                        "$i_url='http://'.$i_url;
                    }
                    fwrite($file,"<b>URL:</b> <a href=\"$i_url\" target=\"_blank\">".
                        "$i_url</a><br />");
                }
                $timeArray = localtime();
                $timeArray[5]+=1900; #year
                $date = sprintf ("%02d:%02d:%02d",$timeArray[2],$timeArray[1],$timeArray[0]);
                $date = $wdays[$timeArray[6]].', '.$timeArray[3].'. '.$month[$timeArray[4]].' '.
                    $timeArray[5].', um '.$date;
                fwrite($file,"<b>Datum:</b> $date<br>");
                send_info_mail($comment,$name,$mail);
                $i_comment = preg_replace ("/\n/", '<br>', $i_comment);
                fwrite($file,"<b>Kommentar:</b> <p>$i_comment</p>".
                    "<hr size=\"1\" noshade=\"noshade\" />\n");
            } else {
                fwrite($file,$f[$i]."\n");
            }
        }
        fclose($file);
    }
    print "<p>Vielen Dank für Deinen Eintrag in meinem Gästebuch.<br />";
    print "<a href=\"guestbook.htm\">Hier kannst Du Dir Deinen Eintrag anschauen</a>.</p></p>";

Hier sehen wir nun Modus zwei. Wenn das guestbook.php mit dem Parameter action=send aufgerufen wird, fügt es den Gästebucheintrag hinzu. Ansonsten zeigt es das Eingabeformular (hier nicht im Bild).

Also wenn wenigstens ein Name, eine E-Mail, eine URL oder ein Kommentar eingetragen wurde, wird der Eintrag auch hinzugefügt. Dann wird die guestbook.htm geladen. Die Funktion stripcslashes entfernt \ Zeichen vor Sonderzeichen wie ", welche automatisch beim Versenden eingefügt werden. Danach wird sie in der Variable $f eingelesen und danach neu zum Schreiben erstellt. Dann wird Zeile für Zeile die Datei wieder geschrieben. Wenn jedoch das Kommentar <!-- beginn --> gefunden wird, dann wird unser Eintrag hinzugefügt. Den Abschnitt, der hinzufügt habe ich einmal etwas abgesetzt. Es wird der Name geschrieben, die E-Mail Adresse inklusive Verlinkung, dann die URL. Wenn die URL nicht mit http:// beginnt wird es angefügt. Danach wird die aktuelle Zeit geholt ($timeArray) und dann formatiert. Wir erinnern uns an die beiden Arrays am Anfang des Scriptes? $wdays[$timeArray[6]] gibt zum Beispiel den Wochentag als Text zurück. Dann werden im Kommentar alle Zeilenumbrüche \n durch <br> ersetzt, damit wir auch im HTML einen Zeilenumbruch erzwingen, (eigentlich werden es <br />, damit es XHTML konform ist). Aber vorher versenden wir natürlich die E-Mail an uns. Weil in der E-Mail wollen wir noch normale Zeilenumbrüche und keine HTML Zeilenumbrüche Smiley glücklich

} else {
    $str = <<<EOD

    <p>Hier kannst einen Eintrag im Gästebuch hinterlassen.</p>

<form method=POST action="guestbook.php?action=send" name="sdf">

<table>
<tr valign=top>
    <td>Name: </td>
    <td><input size="60" name="name"></td>
</tr>
<tr valign=top>
    <td>E-Mail: </td>
    <td><input size="60" name="mail"></td>
</tr>
<tr valign=top>
    <td>URL: </td>
    <td><input size="60" name="url"></td>
</tr>
<tr valign=top>
    <td>Kommentar: </td>
    <td><textarea name="comment" rows="8" cols="60" wrap="virtual"></textarea></td>
</tr>
</table>

<br><input type="submit" value=" Eintragen ">
</form>

EOD;
    print $str;

}

?>

</body>
</html>

Wenn das Script ohne Parameter aufgerufen wird, soll einfach nur das Eingabeformular ausgegeben werden. Das Konstrukt <<<EOD bedeutet, dass alles bis zum Auftauchen der Zeichenkette EOD so interpretiert werden soll, wie es da steht. EOD kann durch etwas beliebiges ersetzt werden. Da man aber EOD wohl nie in einem Text verwenden wird finde ich es ganz gut. Der Vorteil dieses Konstruktes ist, dass man keine Anführungstriche ("Smiley zwinkert maskieren muss. Danach wird einfach die Variable ausgegeben, der wir gerade dieses Zeug zugewiesen haben. Also schreiben wir es so in die Ausgabe (den Browser), wie wir es oben geschrieben haben. Ich hoffe, das ist so verständlich grins

Das war schon das ganze Script. Also im Grunde ganz einfach. Zwei Modi, einmal Formular ausgeben und dieses ruft dann das Script im Modus zwei auf, der dann den Eintrag in die HTML Datei einfügt. Smiley glücklich

Download

So, hier nun die beiden Dateien zum Download. Einfach auf den Server kopieren und sie sind eigentlich sofort lauffähig. Eventuell muss die Datei guestbook.htm noch mit chmod 777 guestbook.htm zusätzliche Schreibrechte gesetzt bekommen. Und natürlich noch die Funktion wo die E-Mail versendet wird, anpassen und auskommentieren Smiley glücklich

 code_gb.zip — Downloads: 228