Teil von  SELFPHP   Teil von  Praxisbuch
Letztes Update: 16.08.2005 17:53:45


Navigation

Seite News *

Seite Startseite
Seite Über SELFPHP
Seite Werbung
Seite Kontakt
Seite Forum *
Seite Download *
Seite SELFPHP Banner *
Seite SELFPHP in Buchform
Seite Newsletter *
Seite Impressum

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  

 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 79.000 Beiträgen finden Sie sicher die passende Antwort!  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 



 

Gästebuch




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&auml;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'>&nbsp;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'>&raquo;&nbsp;</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'>&raquo;</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'>&raquo;&nbsp;</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'>&raquo;&nbsp;</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'>&raquo;&nbsp;</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'>&nbsp;</div>
      </td>
      <td valign='top' class='blocksatz' width='36'>&nbsp;</td>
      <td valign='top' class='blocksatz' colspan='4'>
        <input type='submit' name='senden' value='senden' class='contentblack'>
        <input type='reset' name='losch' value='L&ouml;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'>&nbsp;</td>
    </tr>
  </table>
</form>
<p align="center"><a href='buch.php' class="contentlink">Beitr&auml;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&auml;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&uuml;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'>&nbsp;$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'>&raquo;&nbsp;</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'>&nbsp;</td>
  </tr>
</table>
"
;

include(
"funktionen.php");

}

} else {
echo 
"
<html>
<head>
<title>G&auml;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&uuml;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) ? 0;
}

/////////////////////////////////////////
// Abfrage
/////////////////////////////////////////

if (isset($_POST["senden"])) {
if (
file_exists($datei) && ($aktiv==|| ($aktiv==&& 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==|| ($aktiv==&& 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&auml;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&uuml;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&auml;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&uuml;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&auml;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&uuml;ck</a></p>
    </td>
  </tr>
</table>
"
;

if (!@include(
"buch_inhalt.htm")) {
 echo 
$meldung;
}

?>
<p align="center"><a href='buch_eintrag.php' class="contentlink">Beitr&auml;g Schreiben</a></p>
</body>
</html>





 



 




 sponsored by

Host Europe


HighText iBusiness


Host Europe




© 2001-2006 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt
© 2005-2006 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de