|
PHP Gästebuch und/oder Newsscript programmieren
Ein Gästebuch und ein Newsscript unterscheiden sich nicht wesentlich
voneinander. Beide speichern einzelne Texte und zeigen diese wieder nach
Datum geordnet an. Bei einem Gästebuch geben die Besucher die Beiträge
ein und bei einem Newsscript tut dies der Seitenbetreiber. Bei dem Gästebuch
zeigt man die Eingabemöglichkeit ganz offen auf der Homepage und bei dem News Skript
versteckt man diese halt in einem separaten Adminbereich.
Für die Eingabe des Textes kann man einen sogenannten WYSIWYG Editor verwenden,
um es so komfortabel wie möglich zu gestalten. WYSIWYG bedeutet im Prinzip:
What You See Is What You Get, übersetzt
also "Was du siehst ist, was du bekommst." Verändert man die Schriftgröße, oder
fügt man ein Bild ein, so erscheint dies auch direkt im Eingabefenster - man sieht
also sofort wie das Endergebnis später aussehen wird. Solche Editoren sind in
Javaskript programmiert und es gibt sie schon zu hauf fertig downloadbar im Netz.
Deshalb gehen wir hier auch auf diese Art von Eingabemöglichkeiten nicht weiter
ein - es ist kein PHP und diese sind auch dermaßen komplex, dass wir hier nicht
zum eigentlichen Thema kommen würden. Uns reicht ein einfaches Eingabefeld von
einem Formular. Wenn Sie Ihr Skript später erweitern möchten, versuchen
Sie einen solchen Editor einzubauen.
PHP Gästebuch
Gehen wir zuerst auf das Gästebuch ein. Darauf werden wir dann später aufbauen,
und eine Möglichkeit einfügen um ein Bild mit anzeigen zu können.
Zuerst benötigen wir eine Möglichkeit die gesamten Einträge speichern
zu können. Da wir mit MySQL arbeiten, erstellen wir uns eine entsprechende
Tabelle, in der wir alle benötigten Daten speichern können.
Was müssen wir speichern ? Als erstes ein Feld für eine fortlaufende Nummerierung,
damit jeder Eintrag eindeutig identifiziert werden kann (int, auto_increment). Wir benötigen
den Namen des Erstellers (char 30), einen Titel (char 100), den Text (type text) und das Erstellungsdatum (Datetime).
CREATE TABLE `gaestebuch` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `ersteller` CHAR( 30 ) NOT NULL , `titel` CHAR( 100 ) NOT NULL , `beitrag` TEXT NOT NULL , `datum` DATETIME NOT NULL ) ENGINE = MYISAM ;
|
Jetzt haben wir eine gaestebuch Tabelle in der Datenbank, wo wir unsere
Einträge ablegen können. Fangen wir mit dem Skript an. Als erstes
müssen wir die Datenbank öffnen und eine Verbindung herstellen (MySQL Grundlagen)
<?php $server = "localhost"; $datenbank = "php-kurs"; $username = "web1"; $passwort = "abcdef";
$link = mysql_connect($server, $username, $passwort);
if (!$link) { die("Konnte die Datenbank nicht öffnen. Fehlermeldung: ". mysql_error()); }
echo "Erfolgreich zur Datenbank verbunden !";
$db = mysql_select_db($datenbank, $link);
if (!$db) { echo "Konnte die Datenbank nicht auswählen."; }
mysql_close($link); ?>
|
Die Logindaten müssen natürlich der eigenen Datenbank angepasst werden.
Desweiteren benötigen wir ein Eingabeformular, worüber der Besucher seinen
Text hinterlassen kann. Unsere gesamte Datei nennen wir gaestebuch.php:
<form action="gaestebuch.php" method="POST"> Ihr Name: <input name="ersteller" maxlength=30><br> Titel des Beitrags: <input name="titel" maxlength=100><br> Ihr Gästebucheintrag:<br> <textarea name="beitrag" rows=5 cols=50></textarea><br> <input type="submit" name="submit" value="Eintragen"> </form>
|
Es gibt Eingabefelder für den Namen, einen Titel und einen Textbeitrag. Mit
maxlength haben wir die maximale mögliche Eingabe von Zeichen begrenzt. Unsere
Felder in der MySQL Datenbank fassen nur eine bestimmte Anzahl an Zeichen die wir angegeben haben, so dass es Sinn macht diese zu begrenzen.
Der Besucher gibt nicht unnötig zuviel ein, was später doch nicht angezeigt wird.
Sobald unser Besucher das Formular abschickt, bekommen wir die Daten in dem Array $_POST
geschickt und können die Daten dort abfragen.
<?phpphp $ersteller = trim(strip_tags($_POST["ersteller"])); $titel = trim(strip_tags($_POST["titel"])); $beitrag = trim(strip_tags($_POST["beitrag"]));
if (!empty($_POST["submit"])) { # Formular wurde abgesendet, ist nicht leer ! } ?>
|
Wir machen alles in einer einzigen Datei und
fragen bevor wir das Formular anzeigen einfach ab, ob der User das Formular beim letzten Aufruf
ausgefüllt hat. Wenn $_POST["submit"] nicht leer ist ( !empty() ), dann wurde etwas
ausgefüllt. Wir müssen dann nur prüfen, ob die Eingaben plausibel sind - ob auch
alles eingetragen wurde was wir haben möchten. Ist dies nicht der Fall müssen wir
eine Fehlermeldung auf dem Bildschirm ausgeben. In diesem Beispiel haben wir die Daten aus dem
$_POST nochmal extra gespeichert und verarbeitet. Dies hat einen Sicherheitsaspekt. Der Befehl
strip_tags(); entfernt sämtliche HTML und PHP Befehle aus der Eingabe.
Der User könnte, wenn er böswillig ist sonst Code einschleusen und unsere Seite zu
seinen zwecken missbrauchen. Der Befehl trim(); entfernt einfach nur die
vorhandenen Leerzeichen am Anfang und am Ende der Eingabe. Wir wollen ja keinen Namen haben,
der nur aus 10 Leerzeichen besteht. Der Besucher soll ja schon was richtiges eintragen.
Die Fehlermeldungen können wir in
einem Array speichern.
Wenn wir bei einem Array einfach die eckigen Klammern dahinter setzen [] , dann wird der
Datensatz in dem nächst freien Eintrag gespeichert. Hierzu ein Beispiel wie diese
Abfrage aussehen könnte:
<?phpphp if (empty($ersteller)) $_errors[] = "Name Fehlt."; if (empty($titel)) $_errors[] = "Titel fehlt."; if (empty($beitrag)) $_errors[] = "Beitrag fehlt.";
# Sind Fehler im Array $_errors gespeichert ? if (count($_errors) > 0) { # Ja, Fehler vorhanden - anzeigen ! foreach($_errors as $_error) { echo $_error . "<br>"; } } else { # Nein, keine Fehler - Eintrag in SQL abspeichern } ?>
|
Wenn die Eingabe korrekt gelaufen ist, können wir den Eintrag in der
Datenbank abspeichern. Hierbei bitte ich euch die Eingaben des Users die wir
schon mit strip_tags und trim bearbeitet haben nicht einfach nur abzuspeichern.
Es gibt viele Leute, die versuchen mit SQL Injections Schaden anzurichten. Damit
die Einträge auch richtig abgespeichert werden und kein schadhafter Code
eingeschleust werden kann, bitte ich euch Eingaben von aussen IMMER mit
mysql_real_escape_string() in die Datenbank zu schreiben.
<?phpphp $_sql = 'INSERT INTO gaestebuch (ersteller,titel,beitrag,datum) VALUES ( "'.mysql_real_escape_string($ersteller).'", "'.mysql_real_escape_string($titel).'", "'.mysql_real_escape_string($beitrag).'", NOW());';
mysql_query($_sql, $link); echo "<b>Danke für Ihren Eintrag.</b><br><br>"; ?>
|
Was fehlt uns noch ? Wir müssen natürlich das, was in die Datenbank
geschrieben wurde auch wieder auf der Homepage anzeigen. Hierfür können
wir ein paar Zeilen noch in das Skript einfügen - am besten direkt VOR das
Formular. Wir fordern per SQL Befehl alle Datensätze aus der Tabelle gaestebuch
an und drucken alle mit Hilfe einer While Schleife aus.
Das ganze kann natürlich optisch noch viel mehr von Dir verschönert werden.
Zu Demonstrationszwecken wie man ein Gästebuch programmiert reicht dies allerdings
völlig aus.
<?phpphp $_sql = "SELECT * FROM gaestebuch ORDER BY datum ASC"; $_res = mysql_query($_sql, $link); while ($row = mysql_fetch_array($_res, MYSQL_ASSOC)) { echo "<hr>"; echo "Eintrag Nummer: " . $row["id"]; echo " von " . $row["ersteller"]; echo " vom " . date("d.m.Y - H:i:s", strtotime($row["datum"])); echo "<br>Titel: " . $row["titel"]; echo "<br>Text: ". str_replace("\n", "<br>", $row["beitrag"]); echo "<hr>"; } ?>
|
Mit dem SQL Befehl sagen wir, dass wir alle Einträge haben möchten, nach
aufsteigendem Datum sortiert. Die While Schleife arbeitet solange, wie es Einträge
von der Datenbank bekommt. Jeden einzelnen Eintrag geben wir dann aus. An dem Punkt könnte
man das ganze noch in einen schöneren Rahmen tun - einfach schöner darstellen.
Bei der Textausgabe benutzen wir noch str_replace(); um das Zeichen \\n
zu ersetzen. Bei Formulareingaben ist dieses Zeichen nämlich das Return ; es geht also
eine Zeile tiefer. Verwendet man dieses jedoch bei der Anzeige im HTML, so wird lediglich im
Quelltext ein Zeilenumbruch vorbenommen. Daher ersetzen wir dieses Zeichen durch den Befehl <br>,
wodurch später sichtbar für den Besucher ein Zeilenumbruch erfolgt.
Das fertige Beispielskript zum ausprobieren finden Sie hier.
Das Endskript sollte ungefähr so aussehen (Datei: gaestebuch.php):
<?phpphp $server = "localhost"; $datenbank = "datenbankname"; $username = "dbusername"; $passwort = "dbpasswort";
$link = mysql_connect($server, $username, $passwort);
if (!$link) { die("Konnte die Datenbank nicht öffnen. Fehlermeldung: ". mysql_error()); }
#### "Erfolgreich zur Datenbank verbunden ! ####
$db = mysql_select_db($datenbank, $link); if (!$db) { echo "Konnte die Datenbank nicht auswählen."; }
#### Datenbank ausgewählt, jetzt Gästebuch Programm ####
$ersteller = trim(strip_tags($_POST["ersteller"])); $titel = trim(strip_tags($_POST["titel"])); $beitrag = trim(strip_tags($_POST["beitrag"]));
# Wurde das Formular ausgefüllt ? if (!empty($_POST["submit"])) { # Prüfen ob etwas fehlt if (empty($ersteller)) $_errors[] = "Name Fehlt."; if (empty($titel)) $_errors[] = "Titel fehlt."; if (empty($beitrag)) $_errors[] = "Beitrag fehlt.";
# Sind Fehler im Array $_errors gespeichert ? if (count($_errors) > 0) { # Ja, Fehler vorhanden - anzeigen ! foreach($_errors as $_error) { echo $_error . "<br>"; } } else { # Nein, keine Fehler - Eintrag abspeichern $_sql = 'INSERT INTO gaestebuch (ersteller,titel,beitrag,datum) VALUES ( "'.mysql_real_escape_string($ersteller).'", "'.mysql_real_escape_string($titel).'", "'.mysql_real_escape_string($beitrag).'", NOW());';
mysql_query($_sql, $link);
echo "<b>Danke für Ihren Eintrag.</b><br><br>"; } }
?> <b>Alle Gästebucheinträge:</b><br> <br> <?php $_sql = "SELECT * FROM gaestebuch ORDER BY datum ASC"; $_res = mysql_query($_sql, $link); while ($row = mysql_fetch_array($_res, MYSQL_ASSOC)) { echo "<hr>"; echo "Eintrag Nummer: " . $row["id"]; echo " von " . $row["ersteller"]; echo " vom " . date("d.m.Y - H:i:s", strtotime($row["datum"])); echo "<br>Titel: " . $row["titel"]; echo "<br>Text: ". str_replace("\n", "<br>", $row["beitrag"]); echo "<hr>"; } ?> <br><br> <form action="gaestebuch.php" method="POST"> Ihr Name: <input name="ersteller" maxlength=30><br> Titel des Beitrags: <input name="titel" maxlength=100><br> Ihr Gästebucheintrag:<br> <textarea name="beitrag" rows=5 cols=50></textarea><br> <input type="submit" name="submit" value="Eintragen"> </form> <?php mysql_close($link); ?>
|
Gästebücher und Sicherheit
In Sachen Sicherheit gibt es leider auch etwas zu sagen. Das obige Beispiel
zeigt einem wie man ganz einfach ein Gästebuch programmieren kann. Leider
gibt es viel zu viele Menschen im Internet, die die Arbeit anderer nicht würdigen
und versuchen Schaden anzurichten oder rumzuspammen. Vielfach werden extra
Programme darauf angesetzt Gästebücher, Foren u.ä. mit Internetadressen
und Werbung für komische Tabletten vollzuspammen.
Das führt leider dazu dass man früher oder später einen Schutz
braucht gegen automatische Einträge. Wie Ihr an unserer Kommentarmöglichkeit
unten seht, habe ich ein sogenanntes Capture programmiert und eingebaut. Der Eintrag
geschieht nur, wenn man die Zeichenfolge von dem Bild abtippt und mit eingibt.
Automatisierte Programme können dies nicht oder nur sehr schwer lesen,
wodurch die Spammer sich gleich die nächste Seite suchen. Wie man ein Capture
graphisch generiert und abfragt wäre noch ein weiteres Thema, aber auch hier
gibt es fertige Lösungen die man nur einbauen braucht.
Bilder im Newsskript oder Gästebuch
Das Skript könnte man sehr leicht zu einem Newsskript umfunktionieren. Hierzu
müsste man einfach nur die Eintragsmöglichkeit rausnehmen und in eine
extra Datei packen. Diese könnte man z.B. hinter einem Passwortschutz
(htaccess) tun. Dann wäre nur die Anzeigeroutine in der Homepage und nur der
Webmaster könnte Einträge vornehmen. Da man als Webmaster allerdings
auch mal Bilder mit in den Text einbauen möchte, sollte man strip_tags();rausnehmen. Diese filtern nämlich jeglichen HTML & PHP Code. Wenn dieser
Befehl nicht mehr existiert könnte man Bilder mit einem einfachen HTML Befehl
einbinden:
<img src="mein_bild.jpg" border=0>
|
Zu Anfang würde ich empfehlen die Bilder die man einbaut mit einem FTP Programm
hochzuladen und dann mit diesem IMG Befehl zu verknüpfen. Alternativ kann man
in das Eingabeformular noch ein Feld für einen Dateiupload machen. Will man
allerdings mehr als 1 Bild uploaden, müsste das Programm noch weitaus umfangreicher
sein (Editierfunktionen etc). Der WYSIWYG Editor würde uns an dieser Stelle
auch weiterhelfen, da wir diese HTML Befehle nicht selbst schreiben müssten
bei der Eingabe. Wir würden gleich das Endergebnis sehen und es direkt in
die Datenbank schreiben.
Einfach bei Tante Google mal nach WYSIWYG Editor kostenlos suchen.
Ich hoffe die Erläuterungen haben euch weitergebracht. Experimentiert mit eurem
fertigen Skript ein wenig rum und baut zusätzliche Funktionen ein. Daraus lernt
man und ist mit der Zeit in der Lage noch komplexere Skripte zu programmieren.
|