canaille Mitglied
Angemeldet: 29.11.2003 Beiträge: 227
|
Verfasst am: 10.06.2004, 22:59 Titel:
Einfaches Gästebuch |
|
|
|
|
vorraussetzungen:
- html grundkenntnisse zum anpassen des guestbooks
- webspace/localhost mit php + mysql
- grobes verständnis von phpmyadmin zum erstellen der tabelle in der datenbank
php kenntnisse werden so gut wie nicht vorrausgesetzt
lediglich ein wenig englisch zum verstehen von begriffen wie zb
if (wenn) und else (~ansonsten)
funktionen:
- name / datum / text anzeige
- spamschutz
- "hack"schutz (html code wird unterdrückt)
der komplette code des funktionstüchtigen guestbooks:
Code: |
<?php
$user="";
$db="";
$pw="";
$host="";
mysql_connect($host, $user, $pw);
mysql_select_db($db);
$html="1"
$spam="1"
if(isset($_POST['post'])) {
$text=trim($_POST['text']);
if($html=="1") $text=strip_tags($text);
$text=preg_replace('/([^ ]{32})/', "\\1\n", $text);
$name=trim($_POST['name']);
if($html=="1") $name = strip_tags($name);
if($name && $text !="") {
if($spam=="1") {
$ipqry=mysql_query("SELECT ip FROM guestbook ORDER BY id desc LIMIT 1");
$result=mysql_fetch_assoc($ipqry);
if($result['ip']==$_SERVER['REMOTE_ADDR']) {
echo "Du hast bereits einen Eintrag geschrieben";
} else {
mysql_query("INSERT INTO guestbook (name, text, time, ip) VALUES ('".$name."', '".$text."', '".time()."', '".$_SERVER['REMOTE_ADDR']."')");
}
} else {
mysql_query("INSERT INTO guestbook (name, text, time, ip) VALUES ('".$name."', '".$text."', '".time()."', '".$_SERVER['REMOTE_ADDR']."')");
}
} else {
echo "Es wurden nicht alle Felder ordnungsgemäß ausgefüllt<br><br>";
}
echo "<form method=\"post\">";
echo "Name: <input name=\"name\" type=\"text\" maxlength=\"30\"><br>";
echo "Eintrag: <textarea name=\"text\" cols=\"35\" rows=\"8\" wrap=\"PHYSICAL\"></textarea><br>";
echo "<input type=\"submit\" name=\"post\" value=\"post\">";
echo "</form>";
echo "<br><br><br><br><br>";
$postqry=mysql_query("SELECT * FROM cms_guestbook ORDER BY id DESC");
while($post=mysql_fetch_assoc($postqry)) {
$text=nl2br($post['text']);
echo $post['name']." ".date("d.m.Y H:i", $post['time'])."<br>";
echo $text."<br><br>";
}
?>
|
die sql daten für die tabelle in der datenbank:
Code: | CREATE TABLE `cms_guestbook` (
`id` tinyint(5) unsigned NOT NULL auto_increment,
`name` varchar(30) NOT NULL default '',
`text` text NOT NULL,
`time` int(12) NOT NULL default '0',
`ip` varchar(15) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=25 ; |
so und nun das ganze zerstückelt und erklärt:
Code: | <?php
$user="";
$db="";
$pw="";
$host="";
mysql_connect($host, $user, $pw);
mysql_select_db($db); |
diese zeilen sind dafür da eine verbindung zu der datenbank aufzubauen
dbname/username/passwort/host müssen natuerlich angepasst werden
<?php signalisiert dem server dass hier php code und kein normales html steht
der rest erklärt sich von selbst
Code: | $html="1"
$spam="1" |
hier werden zwei variablen festgelegt bei denen jeweils gilt "1" = an:
1. html code: ist der wert "1" so löscht php sämtliche html commands vor dem eintragen in die datenbank - euer gästebuch wird sicherer ;D
2. spam: ist diese option aktiviert (wert = "1") so wird vor dem eintragen in die datenbank mit einer zusätzlichen query geprüft ob der letzte eintrag von der selben ip stammt
wenn jemand euer gbook vollspammen will so schafft er das nur wenn er nach jedem post seine ip wechselt ;D
Code: | if(isset($_POST['post'])) {
$text=trim($_POST['text']);
if($html=="1") $text=strip_tags($text);
$text=preg_replace('/([^ ]{32})/', "\\1\n", $text);
$name=trim($_POST['name']);
if($html=="1") $name = strip_tags($name); |
als nächstes folgt die erste große if schleife
1. wenn der button "post" zum abschicken gedrückt wird passiert { ... }
2. trim ist eine php funktion zum löschen überflüssiger zeichen/zeilen etc
3. wenn die html code sperre aktiviert ist wird mit hilfe von stripe_tags der html code gelöscht
4. ein regulärer ausdruck (regular expression / reg ex) welcher verhindert dass ein wort mehr als 32 zeichen enthält
nach dem 32sten zeichen wird also automatisch umgebrochen um ein sprengen des designs zu verhindern - die zahl ist natuerlich änderbar
5. wieder trim und strip_tags nur diesmal nicht für den gbook text sondern den namen
Code: | if($name && $text !="") {
if($spam=="1") {
$ipqry=mysql_query("SELECT ip FROM guestbook ORDER BY id desc LIMIT 1");
$result=mysql_fetch_assoc($ipqry);
if($result['ip']==$_SERVER['REMOTE_ADDR']) {
echo "Du hast bereits einen Eintrag geschrieben";
} else {
mysql_query("INSERT INTO guestbook (name, text, time, ip) VALUES ('".$name."', '".$text."', '".time()."', '".$_SERVER['REMOTE_ADDR']."')");
} |
1. wenn die felder "name" und "text" nicht leer geblieben sind wird fortgefahren
2. wenn der spam schutz aktiviert ist wird überprüft ob die ip des letzten posts mit dem neuen uebereinstimmt
wenn ja wird ein text (Du hast bereits einen Eintrag geschrieben) ausgegeben
wenn nicht wird der name und der text in die datenbank geschrieben
3. wenn der spamschutz deaktiviert ist wird der text samt nick ohne zu prüfen ob die ip gleich ist in die datenbank geschreiben
erklärung der query:
das ist eine ganz normale "insert" query im einfachen stil
guestbook stellt den namen der tabelle in der datenbank da
die bezeichnungen in der klammer die spalten in der db
die variablen in der 2ten klammer legen fest was in die jeweilige spalte eingetragen wird - aufpassen: die reihenfolge sowie die anzahl der "values" muss gleich bzw in gleicher reihenfolge dastehen
Code: | } else {
echo "Es wurden nicht alle Felder ordnungsgemäß ausgefüllt<br><br>";
} |
das ist der "ansonsten" teil der ersten if schleife
dh wenn "name" und "text" leer waren wird "Es wurden nicht alle Felder ordnungsgemäß ausgefüllt" ausgegeben und die daten nicht in die datenbank uebermittelt
Code: |
echo "<form method=\"post\">";
echo "Name: <input name=\"name\" type=\"text\" maxlength=\"30\"><br>";
echo "Eintrag: <textarea name=\"text\" cols=\"35\" rows=\"8\" wrap=\"PHYSICAL\"></textarea><br>";
echo "<input type=\"submit\" name=\"post\" value=\"post\">";
echo "</form>";
echo "<br><br><br><br><br>";
|
einfacher html code in php per "echo" ausgegeben
sollte sich von selbst erklären wenn man ein wenig ahnung von html hat
hierbei sollte zu beachten sein dass die namen der inputfelder und textareas mit denen im eigentlichen php code uebereinstimmen müssen
Code: |
$postqry=mysql_query("SELECT * FROM cms_guestbook ORDER BY id DESC");
while($post=mysql_fetch_assoc($postqry)) {
$text=nl2br($post['text']);
echo $post['name']." ".date("d.m.Y H:i", $post['time'])."<br>";
echo $text."<br><br>";
}
?> |
der abschluss des gästebuchs:
1. eine query zum auslesen der vorhanden beiträge
2. die while schleife signalisiert wie und wie oft der code in der schleife ausgegeben werden soll
3. nl2br ist wiedermal eine phpeigene funktion die zuvor im textfeld per "enter taste" eingefügte zeilenumbrüche in html code umsetzt
4. die 2 echo zeilen geben den nick das datum (mit hilfe von date() ) und den text aus
5. ?> schliest den phpcode ab
fragen oder fehler bitte hier im thread schreiben
der admin bereich zum löschen/bearbeiten von posts wird bald kommen
ciao |
|
unex`9dots Administrator
Angemeldet: 02.08.2003 Beiträge: 1106 Wohnort: Karlsruhe Interessen: Coding, Segeln, Schwimmen, PC
|
Verfasst am: 11.06.2004, 13:01 Titel:
|
|
|
|
|
joa zum Glück hab ich nen Designer!!! sonst müsste ich die ganzen Templates selbst machen |
|
unex`9dots Administrator
Angemeldet: 02.08.2003 Beiträge: 1106 Wohnort: Karlsruhe Interessen: Coding, Segeln, Schwimmen, PC
|
Verfasst am: 13.06.2004, 18:21 Titel:
|
|
|
|
|
ne der desiner hat sich geweigert^^
im Endeffekt hab ich mit templates weniger arbeit als wenn cih DEN da dran lasse |
|
Loki Newcomer
Angemeldet: 06.08.2004 Beiträge: 20
|
Verfasst am: 17.08.2004, 18:28 Titel:
|
|
|
|
|
Also erstmal zu den Vars
$html="1"
$spam="1"
ohne ein simiklon am ende wird er einen parse error ausgeben. Und jetzt noch IF ist KEINE Schleife. Es ist lediglich eine Abfrage. Schlefe bezeichnet man nur while(-do), for, foreach usw. |
|
supergreg Newcomer
Angemeldet: 09.10.2004 Beiträge: 2
|
Verfasst am: 09.10.2004, 15:58 Titel:
|
|
|
|
|
Google mal nach "SQL-Injection"...
name: "tester"
text: "Aua...'); DELETE FROM cms_guestbook --"
Leider gibt's solche "Tutorials" überall im Netz, nur ist damit niemand geholfen, jeder macht einfach nur stur die gleichen Fehler nach |
|