|
| |
sponsered by
 |
|
| Letztes Update: 16.08.2005 17:53:45 |
|
| |
| * Link führt ins Internet |
|
| |
Nach einem Besucherzähler sollten Sie versuchen sich mit einem etwas komplexeren Problem zu befassen, nämlich der Umsetzung eines Gästebuchs. Wenn man es genau nimmt ist dies auch nicht viel komplizierter als die Realisierung eines vollfunktionsfähigen Besucherzählers.
Ein Gästebuch findet man heutzutage auf einer Vielzahl von Websites, ob bei Privatpersonen, Firmen oder Vereinen. Es seinen Besuchern zu ermöglichen eine Nachricht zu hinterlassen hatte schon immer das gewisse etwas.
Das folgende Gästebuch, welches wir Ihnen vorstellen wollen setzt sich aus folgenden Dateien zusammen:
. buch_eintrag.php - in diesem Skript befindet sich die Eingabemaske (Formular), welches es dem Besucher ermöglicht einen Gästebuch-Eintrag vorzunehmen.
. buch_funktionen.php - in diesem Skript werden die Daten, welche aus buch_eintrag.php stammen gefiltert und überprüft. Diese werden anschliessend von funktionen.php weiter verarbeitet.
. funktionen.php - in diesem Skript wird dafür gesorgt, dass die buch_inhalt.htm und die ips.txt erzeugt werden. Sollte die buch_inhalt.htm bereits vorhanden sein wird der Inhalt durch die Daten des neuen Eintrags ergänzt. Sollte die ips.txt vorhanden sein, wird überprüft ob der Besucher einen doppelten Eintrag vornehmen möchte, dies wird jedoch durch die Reload-Sperre verhindert.
. ips.txt - enthält die gesperrten IP-Adressen samt Zeitstempel.
. autorespond.php - in diesem Skript wird dafür gesorgt, dass sowohl der Gästebuchbetreiber (webmaster) als auch der Besucher eine mail erhalten.
. buch.php - in diesem Skript wird überprüft, ob die buch_inhalt.htm bereits existiert und falls diese der Fall ist, wird der Inhalt der Datei ausgegeben.
. buch_inhalt.htm - in dieser Datei befinden sich sämtliche Gästebuch-Einträge.
. automail.txt - hierbei handelt es sich um die Autorespond-Nachricht, welche nach einem Eintrag ins Gästebuch an den Besucher per mail versandt wird.
. main.css - diese CSS-Datei sorgt für die Layout-Formatierung des Gästebuchs.
Sowohl die main.css als auch die automail.txt befinden sich in einem jeweils gesonderten Ordner. Die Ordner sorgen, dafür das die Übersicht gewart bleibt, folgende Ordner werden eingesetzt:
. bild - dieser enthält das Gästebuchlogo (gbuchlogo.gif), hier können Sie nach belieben weiter Grafikdatein ablegen.
. css - dieser enthält die CSS-Datei (main.css), welche für die Layout-Formatierung des Gästebuch zuständig ist.
. text - dieser enthält die Textdatei (automail.txt), mit der Autorespond-Nachricht die für den Besucher bestimmt ist.
Struktur des Atomic-Gästebuch
Nun sollten Sie einen Blick auf die eingesetzten Skript werfen:
1. Buch_eintrag.php
<html>
<head>
<title>Gästebuch v1.0</title>
<link rel='stylesheet' href='css/main.css' type='text/css'>
</head>
<body bgcolor='#FFFFFF' text='#000000'>
<p align='center'><img src='bild/gbuchlogo.gif' width='800' height='80'></p>
<form method='post' action='buch_funktionen.php'>
<table width='400' align='center'>
<tr align='left'>
<td class='latestnews' colspan='6'> Kommentar</td>
</tr>
<tr>
<td colspan='6' class='autor' height='10'>
<div align='right'></div>
</td>
</tr>
<tr>
<td valign='top' width='9'>
<div class='morelink'>» </div>
</td>
<td valign='top' class='blocksatz' width='36'>Name: </td>
<td valign='top' class='blocksatz' width='190'>
<input type='text' name='fname' class='contentblack' size='30' maxlength='50'>
</td>
<td valign='top' class='morelink' width='6'>»</td>
<td valign='top' class='blocksatz' width='40'>Rubrik:</td>
<td valign='top' class='blocksatz' width='91'>
<select name='fbetreff' class='contentblack'>
<option value='Kritik'>Kritik</option>
<option value='Anregung'>Anregung</option>
<option value='Lob'>Lob</option>
<option value='Allgemein'>Allgemein</option>
</select>
</td>
</tr>
<tr>
<td valign='top' width='9'>
<div class='morelink'>» </div>
</td>
<td valign='top' class='blocksatz' width='36'>E-mail: </td>
<td valign='top' class='blocksatz' colspan='4'>
<input type='text' name='femail' class='contentblack' size='30' maxlength='50'>
</td>
</tr>
<tr>
<td valign='top' width='9'>
<div class='morelink'>» </div>
</td>
<td valign='top' class='blocksatz' width='36'>Inhalt: </td>
<td valign='top' class='blocksatz' colspan='4'>
<textarea name='finhalt' class='contentblack' cols='30' rows='5' wrap='PHYSICAL'></textarea>
</td>
</tr>
<tr>
<td valign='top' width='9'>
<div class='morelink'>» </div>
</td>
<td valign='top' class='blocksatz' width='36'>Home: </td>
<td valign='top' class='blocksatz' colspan='4'>
<input type='text' name='fhome' class='contentblack' size='30' maxlength='50'>
</td>
</tr>
<tr>
<td valign='top' width='9'>
<div class='morelink'> </div>
</td>
<td valign='top' class='blocksatz' width='36'> </td>
<td valign='top' class='blocksatz' colspan='4'>
<input type='submit' name='senden' value='senden' class='contentblack'>
<input type='reset' name='losch' value='Löschen' class='contentblack'>
</td>
</tr>
<tr>
<td colspan='6' class='autor' height='10'>
<div align='right'></div>
</td>
</tr>
<tr>
<td colspan='6' class='latestnews'> </td>
</tr>
</table>
</form>
<p align="center"><a href='buch.php' class="contentlink">Beiträge Lesen</a></p>
</body>
</html>
|
Eingabemaske des Gästebuchs
2. Buch_funktionen.php
<?php
//Stammen die Daten vom Formular?
if (isset($_POST["senden"])) {
//Textfeldeingaben Filtern
function daten_reiniger($inhalt) {
if (!empty($inhalt)) {
//HTML- und PHP-Code entfernen.
$inhalt = strip_tags($inhalt);
//Umlaute und Sonderzeichen in
//HTML-Schreibweise umwandeln
$inhalt = htmlspecialchars($inhalt);
//Entfernt überflüssige Zeichen
//Anfang und Ende einer Zeichenkette
$inhalt = trim($inhalt);
//Backslashes entfernen
$inhalt = stripslashes($inhalt);
}
return $inhalt;
}
//Schreibarbeit durch Umwandlung ersparen
foreach ($_POST as $key=>$element) {
//Dynamische Variablen erzeugen, wie g_fname, etc.
//und die Eingaben Filtern
${"g_".$key} = daten_reiniger($element);
}
//Anfang - Prüfung
//Kein richtiger Name eingegeben
if(strlen($g_fname)<3){
$error_msg="Bitte geben Sie Ihren Namen an";
}
//Kein Eintrag vorgenommen
if(strlen($g_finhalt)<3){
$error_msg.="<br>Bitte geben Sie auch etwas in das Gästebuch ein.";
}
//Mailadresse korrekt angegeben - entsprechende Formatierung vornehmen
if(ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$",$g_femail)){
$format_femail="<a href=mailto:" . $g_femail . ">E-Mail</a>";
} else {
$error_msg.="<br>Fehlerhafte E-mail!<br>";
}
//Es wurde auch eine Homepageadresse angegeben - entsprechende Formatierung vornehmen
if(ereg("^([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$",$g_fhome)){
// fehlt in der Angabe der Adresse - hier ergänzen
if(!ereg("^//",$g_fhome)){
$g_fhome="" . $g_fhome;
}
$g_fhome="<a href=" . $g_fhome . " target=_blank>Website</a>";
} else {
$g_fhome="<a href=" . $g_fhome . " target=_blank>Website</a>";
}
//Ende - Prüfung
//Prüfen ob Fehler vorgekommen sind!
if($error_msg){
echo "
<html>
<head>
<title>Gästebuch v1.0</title>
<link rel='stylesheet' href='css/main.css' type='text/css'>
</head>
<body bgcolor='#FFFFFF' text='#000000'>
<p align='center'><img src='bild/gbuchlogo.gif' width='800' height='80'></p>
<table width='300' align='center'>
<tr>
<td align='center' class='latestnews' colspan='3'>- FEHLER - <br>
<p>$error_msg</p>
<a href='javascript:history.back()' class='contentlink'>Zurück</a><br>
Eintrag konnte nicht angelegt werden.<br>
Versuchen Sie es bitte erneut!<br>
</td>
</tr>
</table>
</body>
</html>
";
} else {
$g_fdatum=date("Y-m-d H:i:s");
$eintrag="
<table width='400' align='center'>
<tr align='left'>
<td class='latestnews' colspan='2'> $g_fbetreff</td>
</tr>
<tr>
<td colspan='2' class='autor'>
<div align='right'>$g_fdatum</div>
</td>
</tr>
<tr>
<td valign='top' width='13'>
<div class='morelink'>» </div>
</td>
<td valign='top' class='blocksatz' width='375'>". nl2br($g_finhalt) ."</td>
</tr>
<tr>
<td colspan='2' class='contentblack'>
<div align='right'>$g_fname</div>
</td>
</tr>
<tr>
<td valign='top' colspan='2'>
<table width='100%' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td class='autor'>
<div align='left'>[ $format_femail ]</div>
</td>
<td class='autor'>
<div align='right'>[ $g_fhome ]</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan='2' class='latestnews'> </td>
</tr>
</table>
";
include("funktionen.php");
}
} else {
echo "
<html>
<head>
<title>Gästebuch v1.0</title>
<link rel='stylesheet' href='css/main.css' type='text/css'>
</head>
<body bgcolor='#FFFFFF' text='#000000'>
<p align='center'><img src='bild/gbuchlogo.gif' width='800' height='80'></p>
<table width='300' align='center'>
<tr>
<td align='center' class='latestnews' colspan='3'>- FEHLER - <br>
Eintrag konnte nicht angelegt werden.<br>
Versuchen Sie es bitte erneut!<br>
<a href='buch_eintrag.php' class='contentlink'>Zurück</a></td>
</tr>
</table>
</body>
</html>
";
}
?>
|
Wie Sie sehen werden die Daten aus den Formularelementen durch die Funktion daten_reiniger() gefiltert. Folgende Bestandteile werden gefiltert:
. strip_tags() - entfernt HTML- und PHP-Code.
. htmlspecialchars() - wandelt Umlaute und Sonderzeichen in HTML-Schreibweise um.
. trim() - entfernt überflüssige Zeichen am Anfang und Ende einer Zeichenkette.
. stripslashes() - entfernt Backslashes aus der Zeichenfolge.
Fehlermeldung bei nicht korrekten Angaben
Die gefilterten Daten werden anschliessend nochmals überprüft, vor allem der Inhalt des E-mail und des Home-Formularelements wird mit Hilfe von regulären Ausdrücken genauer unter die Lupe genommen.
3. Funktionen.php
<?
/////////////////////////////////////////
// Gästebuch + Reloadsperre v1.0
/////////////////////////////////////////
// 0=keine Reloadsperre, 1=Reloadsperre
$aktiv = 1;
// Zeit der Reloadsperre in Minuten
$zeit = 5;
// IP-Datei
$ipdatei = "ips.txt";
// Buchdatei
$datei = "buch_inhalt.htm";
/////////////////////////////////////////
// IP-Reloadsperre
/////////////////////////////////////////
function pruf_IP($rem_addr) {
global $ipdatei,$zeit;
@$ip_array = file($ipdatei);
$reload_dat = fopen($ipdatei,"w");
$this_time = time();
for ($i=0; $i<count($ip_array); $i++) {
list($ip_addr,$time_stamp) = explode("|",$ip_array[$i]);
if ($this_time < ($time_stamp+60*$zeit)) {
if ($ip_addr == $rem_addr) {
$gefunden=1;
}
else {
fwrite($reload_dat,"$ip_addr|$time_stamp");
}
}
}
fwrite($reload_dat,"$rem_addr|$this_time\n");
fclose($reload_dat);
return ($gefunden==1) ? 1 : 0;
}
/////////////////////////////////////////
// Abfrage
/////////////////////////////////////////
if (isset($_POST["senden"])) {
if (file_exists($datei) && ($aktiv==0 || ($aktiv==1 && pruf_IP($REMOTE_ADDR)==0))) {
// Falls die Datei existiert, wird sie ausgelesen und
// die enthaltenen Daten werden durch den neuen Beitrag
// ergänzt
$fp=fopen($datei,"r+");
$daten=fread($fp,filesize($datei));
rewind($fp);
flock($fp,2);
fputs($fp,"$eintrag \n $daten");
flock($fp,3);
fclose($fp);
include("autorespond.php");
header("Location:buch.php");
}else if (!file_exists($datei) && ($aktiv==0 || ($aktiv==1 && pruf_IP($REMOTE_ADDR)==0))) {
// Die Datei buch_inhalt.htm existiert nicht, sie wird
// neu angelegt und mit dem aktuellen Beitrag gespeichert.
$fp=fopen($datei,"w");
fputs($fp,"$eintrag \n");
fclose($fp);
include("autorespond.php");
header("Location:buch.php");
} else {
// Die Datei existiert zwar, jedoch handelt
// es sich wahrscheinlich um den gleichen Besucher
header("Location:buch.php");
}
} else {
echo "
<html>
<head>
<title>Gästebuch v1.0</title>
<link rel='stylesheet' href='css/main.css' type='text/css'>
</head>
<body bgcolor='#FFFFFF' text='#000000'>
<p align='center'><img src='bild/gbuchlogo.gif' width='800' height='80'></p>
<table width='300' align='center'>
<tr>
<td align='center' class='latestnews' colspan='3'>- FEHLER - <br>
Eintrag konnte nicht angelegt werden.<br>
Versuchen Sie es bitte erneut!<br>
<a href='buch_eintrag.php' class='contentlink'>Zurück</a></td>
</tr>
</table>
</body>
</html>
";
}
?>
|
Der Inhalt dieses Skripts sollte Ihnen bereits bekannt vorkommen, dieser setzt sich nämlich grösstenteils aus Bestandteilen des Besucherzählers zusammen.
4. Autorespond.php
<?php
if (isset($_POST["senden"])) {
// Mail an Webmaster
$webmaster="matthiask@flashstar.de";
$mailinhalt = "
Atomic-Book - Eintrag\n
__________________\n
Person: $g_fname\n
E-mail: $g_femail\n
WWW: $g_fhome\n
__________________\n
Betreff: $g_fbetreff\n
Kommentar:\n$g_finhalt\n
__________________\n
Zeit: $g_fdatum\n
__________________\n";
@mail($webmaster, "$g_fbetreff (von $g_fname) - Eintrag", $mailinhalt, "From: $g_femail");
// Autoresponder
$datei = "text/automail.txt";
$fp = fopen($datei, "r");
$inhalt = fread($fp,filesize($datei));
fclose($fp);
@mail("$g_femail", "Atomic-Book - Danke für Ihren Eintrag", "$inhalt\n\n","From:$webmaster");
} else {
echo "
<html>
<head>
<title>Gästebuch v1.0</title>
<link rel='stylesheet' href='css/main.css' type='text/css'>
</head>
<body bgcolor='#FFFFFF' text='#000000'>
<p align='center'><img src='bild/gbuchlogo.gif' width='800' height='80'></p>
<table width='300' align='center'>
<tr>
<td align='center' class='latestnews' colspan='3'>- FEHLER - <br>
Eintrag konnte nicht angelegt werden.<br>
Versuchen Sie es bitte erneut!<br>
<a href='buch_eintrag.php' class='contentlink'>Zurück</a></td>
</tr>
</table>
</body>
</html>
";
}
?>
|
Um die Gästebuch-Einträge lediglich zu betrachten wird folgendes Skript benötigt.
5. Buch.php
<html>
<head>
<title>Gästebuch v1.0</title>
<link rel='stylesheet' href='css/main.css' type='text/css'>
</head>
<body bgcolor='#FFFFFF' text='#000000'>
<p align='center'><img src='bild/gbuchlogo.gif' width='800' height='80'></p>
<?php
$meldung="
<table width='300' align='center'>
<tr>
<td align='center' class='latestnews' colspan='3'><br>- LEER -<br>
<p><a href='buch_eintrag.php' class='contentlink'>Zurück</a></p>
</td>
</tr>
</table>
";
if (!@include("buch_inhalt.htm")) {
echo $meldung;
}
?>
<p align="center"><a href='buch_eintrag.php' class="contentlink">Beiträg Schreiben</a></p>
</body>
</html>
|
|
|
|
|
|
|
|
|