quakenet:#php Tutorial

Author: Progman, zuletzt bearbeitet von progman @ 2006/03/13 17:04:41

Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.

Unser eigenes Gästebuch

  1. Grundgedanke
  2. Was soll gespeichert werden?
  3. Script zum anzeigen des Gästebuchs
  4. Das Script mit dem Formular
  5. Script zum hinzufügen des Eintrags
  6. Nachteile vom diesem Gästebuch

1. Grundgedanke

Jeder kennt ein Gästebuch. Dort kann man sich eintragen und sagen wie man die Seite findet oder nur einfach um einen zu grüßen. Ein Gästebuch ist eigentlich so was ähnliches wie ein Newsscript mit dem Unterschied, dass alle User einen Eintrag in einem Gästebuch machen können. Wir können dabei jetzt nicht PHPMyAdmin freigeben und sagen "Zum Eintragen auf {link-von-phpmyadmin} klicken und dort euch eintragen". Dann könnte man gleich den FTP-Account vom Webserver hinschreiben. Wir müssen also ein Formular schreiben, wo man seine Daten eingeben kann. Dieses Formular wird dann an ein PHP-Script geschickt, welches dann die Daten, und nur diese Daten, in die MySQL-Datenbank einträgt. Dies sind dann insgesammt 3 Dateien. Eine Datei die das Gästebuch anzeigt, eine weitere wo das Formular ist und die letzte Datei verarbeitet dann das Formular.

2. Was soll gespeichert werden?

Wieder kommt die Frage, was gespeichert werden soll. Einmal soll der Name des Besuchers gespeichert werden. Dann hat der User bestimmt eine Emailadress und vielleicht auch noch eine Homepage. Und dann natürlich noch der eigentliche Text, den man ins Gästebuch reinschreiben möchte. Dies sind dann schonmal ... *zähl* ... 4 Spalten. Wir brauchen aber noch 2 weitere Felder. Einmal ein Feld für das Datum und dann noch das Feld mit der ID. Dies sind dann insgesammt 6 Spalten.

Der benötige MySQL-Querybefehl sieht dann so aus.

CREATE TABLE gaestebuch (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(20),
    Email VARCHAR(70),
    Homepage VARCHAR(70),
    Inhalt TEXT,
    Datum DATETIME
);
        

Email und Homepage habe ich jetzt mal auf Maximale Größe von 70 gelegt. Wenn jemand meint das dass zuviel oder zuwenig ist, kann die Zahl natürlich anpassen.

Diese Tabelle kann man nun mit einem PHP-Script oder besser mit PHPMyAdmin erstellen.

3. Script zum anzeigen des Gästebuchs

Wir legen eine neue Datei gb.php an. Diese Datei zeigt dann alle Einträge des Gästebuch an. Wir sollten sicherstellen, dass diese Datei im Array $dateien vorhanden ist (bezogen jetzt auf unser schon vorhandenes 3 Spalten Layout).

<?php
    $dateien
= array();
    
$dateien['news'] = "news.php";
    
//...
    
$dateien['gb'] = "gb.php";
?>

In der neuen Datei (gb.php) schreiben wir wieder zuerst eine Überschrift.

<?php
    
echo "<h2>Gästebuch</h2>\n";
?>

Dann müssen wir den MySQL-Query schicken.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
?>

Üblicherweise wird ausgegeben wieviele Einträge in der Datenbank vorhanden sind. Dies macht man wie üblich mit mysql_num_rows.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";
?>

Dann kommt wieder unsere While-Schleife.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {

    }
?>

Wir erstellen erstmal eine Grundtabelle, wo welche Information reinkommt.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {
        echo
"<div class=\"gb-eintrag\">\n";
        echo
"    <div class=\"Kopfdaten\">\n";
        echo
"        {name} schrieb um {datum}\n";
        echo
"    </div>\n";
        echo
"    <div class=\"Inhalt\">\n";
        echo
"        {text}\n";
        echo
"    </div>\n";
        echo
"</div>\n";
    }
?>

An den Stellen fügen wir nun unsere Arrayelemente ein.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {
        echo
"<div class=\"gb-eintrag\">\n";
        echo
"    <div class=\"Kopfdaten\">\n";
        echo
"        ".$row['Name']." schrieb um ".$row['Datum']."\n";
        echo
"    </div>\n";
        echo
"    <div class=\"Inhalt\">\n";
        echo
"        ".nl2br($row['Inhalt'])."\n";
        echo
"    </div>\n";
        echo
"</div>\n";
    }
?>

Jetzt müssen wir noch die Emailadresse und Homepage angeben, fallst vorhanden. Da müssen wir ein paar If-Abfragen schreiben. Wenn eine Emailadresse angegeben wurde, so soll die Emailadresse als Link vom Namen erscheinen.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {
        echo
"<div class=\"gb-eintrag\">\n";
        echo
"    <div class=\"Kopfdaten\">\n";
        if(
trim($row['Email']) == "") {
            echo
$row['Name'];
        } else {
            echo
"<a href=\"mailto:".$row['Email']."\">".$row['Name']."</a>\n";
        }
        echo
" schrieb um ".$row['Datum']."\n";
        echo
"    </div>\n";
        echo
"    <div class=\"Inhalt\">\n";
        echo
"        ".nl2br($row['Inhalt'])."\n";
        echo
"    </div>\n";
        echo
"</div>\n";
    }
?>

Mit isset können wir nicht arbeiten denn das Arrayelement ist immer gesetzt, egal ob was in der Tabellenspalte steht oder nicht. Wenn keine Emailadresse eingegeben wurde, so ist in diesem Arrayelement ein leerer String. Die Funktion trim liefert einen String zurück, wo alle Leerzeichen und Zeilenumbrüche vor und nach einem String gelöscht werden.

<?php
    $var
= "         bla       ";
    
$var = trim($var);
    echo
$var; // gibt "bla" aus
?>

Wenn kein sichtbares Zeichen vorhanden ist, so liefert trim entsprechend einen leeren String zurück, da es dann alle nicht-sichtbaren Zeichen löscht. Diesen Rückgabewert von trim vergleichen wir dann mit "" und daran können wir erkennen, ob eine Emailadresse angegeben wurde oder nicht.

Die Homepage soll jetzt nur angezeigt werden, wenn sie auch angegeben wurde. Dies macht man wieder mit einer If-Abfrage.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {
        echo
"<div class=\"gb-eintrag\">\n";
        echo
"    <div class=\"Kopfdaten\">\n";
        if(
trim($row['Email']) == "") {
            echo
$row['Name'];
        } else {
            echo
"<a href=\"mailto:".$row['Email']."\">".$row['Name']."</a>\n";
        }
        if(
trim($row['Homepage']) != "") {
            echo
" (<a href=\"".$row['Homepage']."\">Homepage</a>)";
        }

        echo
" schrieb um ".$row['Datum']."\n";
        echo
"    </div>\n";
        echo
"    <div class=\"Inhalt\">\n";
        echo
"        ".nl2br($row['Inhalt'])."\n";
        echo
"    </div>\n";
        echo
"</div>\n";
    }
?>

Jetzt haben wir aber noch eine Sache vergessen. Manche User geben die URL ohne http:// an, also z.B. www.meine-hp.de. Durch dieses Script würde in so einem Fall der Link wie folgt erzeugt.

<a href="www.meine-hp.de">Homepage</a>
        

Der Browser, der diesen Link 'sieht', erkennt diesen Link nicht als Link zu einer anderen URL, sondern als ein Link zu einer Datei auf dem gleichen Webserver. Wenn man nun diesen Link anklickt dann würde man z.B. folgende URL öffnen: http://www.clan-xy.de/www.meine-hp.de. Diese Datei www.meine-hp.de wird der Browser nicht auf dem Webserver finden können und es kommt eine 404 Fehlermeldung "File Not Found". Damit der Browser diesen Link als URL erkennt muss vor der URL ein http://. Also schreiben wir das hin.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {
        echo
"<div class=\"gb-eintrag\">\n";
        echo
"    <div class=\"Kopfdaten\">\n";
        if(
trim($row['Email']) == "") {
            echo
$row['Name'];
        } else {
            echo
"<a href=\"mailto:".$row['Email']."\">".$row['Name']."</a>\n";
        }
        if(
trim($row['Homepage']) != "") {
            echo
" (<a href=\"http://".$row['Homepage']."\">Homepage</a>)";
        }

        echo
" schrieb um ".$row['Datum']."\n";
        echo
"    </div>\n";
        echo
"    <div class=\"Inhalt\">\n";
        echo
"        ".nl2br($row['Inhalt'])."\n";
        echo
"    </div>\n";
        echo
"</div>\n";
    }
?>

Nur so einfach ist das nicht. Was ist denn mit den Leuten die die URL richtig eingeben, also mit http://. Dann würde so ein Link erzeugt werden.

<a href="http://http://www.meine-hp.de/">Homepage</a>
        

PHP soll also nur dann ein http:// hinzufügen, wenn kein http:// vorhanden ist. Dies macht man dann wieder mit einer If-Abfrage und der Funktion substr.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {
        echo
"<div class=\"gb-eintrag\">\n";
        echo
"    <div class=\"Kopfdaten\">\n";
        if(
trim($row['Email']) == "") {
            echo
$row['Name'];
        } else {
            echo
"<a href=\"mailto:".$row['Email']."\">".$row['Name']."</a>\n";
        }
        if(
trim($row['Homepage']) != "") {
            if(
strtolower(substr($row['Homepage'], 0, 7)) == "http://") {
                
// Wenn der Teilstring gleich "http://" ist, so
                // soll er den Link ohne "http://" erzeugen, denn
                // der Steht ja schon drin
                
echo " (<a href=\"".$row['Homepage']."\">Homepage</a>)";
            } else {
                
// Wenn nicht, so soll er das "http://" manuell hinzufügen
                
echo " (<a href=\"http://".$row['Homepage']."\">Homepage</a>)";
            }
        }

        echo
" schrieb um ".$row['Datum']."\n";
        echo
"    </div>\n";
        echo
"    <div class=\"Inhalt\">\n";
        echo
"        ".nl2br($row['Inhalt'])."\n";
        echo
"    </div>\n";
        echo
"</div>\n";
    }
?>

Wir holen uns mit substr nur die ersten 7 Zeichen des Strings, hier die URL der Homepage. Wenn diese gleich dem String http:// ist, so brauchen wir das http:// nicht mehr hinzufügen.

Was wir jetzt noch brauchen ist ein Link zu dem Formular. Dies fügen wir oben nach dem Text "Gästebuch" ein.

<?php
    
echo "<h2>Gästebuch</h2>\n";
    echo
"<p>\n";
    echo
"    <a href=\"index.php?section=gb_add\">Ins Gästebuch reinschreiben</a>\n";
    echo
"</p>\n";
    
$sql = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC"
;
    
$result = mysql_query($sql) OR die(mysql_error());
    echo
"<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo
"<hr>\n";

    while(
$row = mysql_fetch_assoc($result)) {
        echo
"<div class=\"gb-eintrag\">\n";
        echo
"    <div class=\"Kopfdaten\">\n";
        if(
trim($row['Email']) == "") {
            echo
$row['Name'];
        } else {
            echo
"<a href=\"mailto:".$row['Email']."\">".$row['Name']."</a>\n";
        }
        if(
trim($row['Homepage']) != "") {
            if(
strtolower(substr($row['Homepage'], 0, 7)) == "http://") {
                
// Wenn der Teilstring gleich "http://" ist, so
                // soll er den Link ohne "http://" erzeugen, denn
                // der Steht ja schon drin
                
echo " (<a href=\"".$row['Homepage']."\">Homepage</a>)";
            } else {
                
// Wenn nicht, so soll er das "http://" manuell hinzufügen
                
echo " (<a href=\"http://".$row['Homepage']."\">Homepage</a>)";
            }
        }

        echo
" schrieb um ".$row['Datum']."\n";
        echo
"    </div>\n";
        echo
"    <div class=\"Inhalt\">\n";
        echo
"        ".nl2br($row['Inhalt'])."\n";
        echo
"    </div>\n";
        echo
"</div>\n";
    }
?>

In dem Array $dateien muss dann ein neuer Eintrag für section=gb_add gemacht werden.

Dies ist nun das Script, dass den Inhalt des Gästebuchs anzeigt. Nun kommt die Datei, die das Formular erstellt.

4. Das Script mit dem Formular

Das Script was das Formular erstellt ist relativ einfach. Für dieses Script brauchen wir nichtmal den PHP-Modus. Wir können direkt als HTML schreiben.

Erstmal erzeugen wir eine Überschrift, damit der User weiß wo er sich überhaupt befindet.

<h2>Eintrag ins Gästebuch hinzufügen</h2>
        

Da wir ein Formular brauchen erstellen wir halt eins. Diese Formular muss mit method="POST" und an die Datei index.php?section=gb_insert gesendet werden.

<h2>Eintrag ins Gästebuch hinzufügen</h2>
<form action="index.php?section=gb_insert" method="POST" class="gb_form">
</form>
        

Den class Eintrag hab ich hinzugefügt damit man das Formular mit CSS bearbeiten kann. Jetzt kommen die Eingabefelder hinzu.

<h2>Eintrag ins Gästebuch hinzufügen</h2>
<form action="index.php?section=gb_insert" method="POST" class="gb_form">
    <input type="text" name="Name" />
    <input type="text" name="Email" />
    <input type="text" name="Homepage" />
    <textarea name="Text" rows="40" cols="10"></textarea>
    <input type="submit" name="submit" value="Speichern" />
    <input type="reset" name="submit" value="Zurücksetzen" />
</form>
        

Jetzt weiß der User ab nicht, wo er was eingeben soll. Deswegen sollten wir die Formularelemente mit CSS formatieren und diverse Infotexte hinschreiben.

<h2>Eintrag ins Gästebuch hinzufügen</h2>
<form action="index.php?section=gb_insert" method="post" class="formular">
    <ol>
        <li>
            <label for="name">Name</label>
            <input type="text" name="Name" id="name" />
        </li>
        <li>
            <label for="email">Email</label>
            <input type="text" name="Email" id="email" />
        </li>
        <li>
            <label for="homepage">Homepage</label>
            <input type="text" name="Homepage" id="homepage" />
        </li>
        <li>
            <label for="beitrag">Beitrag</label>
            <textarea name="Text" id="beitrag"></textarea>
        </li>
        <li>
            <input type="submit" name="submit" value="Speichern" />
            <input type="reset" name="submit" value="Zurücksetzen" />
        </li>
    </ol>
</form>
        

Die Formartierungen in der CSS-Datei könnten so aussehen.

.formular {
    background-color: #EEEEFF;
    border: 1px solid black;
    text-align: center;
}
.formular > ol {
    list-style-type: none;
    margin: 2px;
    padding: 5px;
}
.formular > ol > li {
    vertical-align: top;
}
.formular * label:after {
    content: ":";
}
        

Dies ist alles was man braucht. Der User gibt dort seine Daten ein und schickt diese Daten an index.php?section=gb_insert. Das dort liegende Script fügt dann den Datensatz in die MySQL-Tabelle ein. Dieses Script muss natürlich auch über das Array $dateien eingebunden werden.

5. Script zum hinzufügen des Eintrags

Dieses Script ist das schwierigste von allen. Denn dieses Script musst die Eingabe des Users auf alle möglichen Hackerattacken reagieren. Es muss z.B. Cross-Site-Scripting (kurz XSS) verhindern und bestimmte Eingaben überprüfen damit diese weder die Seite noch die Datenbank zerstört. Diese Überprüfung geht mit Regulären Ausdrücken (kurz Regex) sehr gut, doch da wir dies noch nicht können, benutzen wir erstmal andere Schutzmechanismen.

Zur Testzwecken geben wir erstmal die Werte in $_POST aus. Dies machen wir mit der Funktion print_r.

<?php
    
echo "<pre>\n";
    
print_r($_POST);
    echo
"</pre>\n";
?>

Wenn wir nun in den Feldern ein ', " oder \ eingeben, so kann es passieren das der Text anders im Array steht als erwartet. Zum testen geben wir mal folgenden String in die Textarea ein.

Ein Text mit ' und mit " und
dann auch noch mit \ damit man
sieht was PHP macht.
        

PHP wandelt diesen String wie folgt um.

Ein Text mit \' und mit \" und
dann auch noch mit \\ damit man
sieht was PHP macht.
        

Dieses Phänomän nennt man magic_quotes. Dies macht PHP aus Sicherheitsgründen, falls man diesen String z.B. in eine Datenbank speichern möchte. Find ich zwar nett von PHP, aber ich möchte doch gerne meine Strings selber bearbeiten. Ich hätte gerne selber die Kontrolle über meine Scripte.

Da wir die PHP-Einstellung magic_quotes_gpc nicht ausschalten können, müssen wir die Strings wieder zurückwandeln. Dies sollten wir aber nur machen, wenn magic_quotes_gpc auch wirklich an ist. Nicht das wir auch die Backslashes aus dem String löschen, obwohl kein magic_quotes_gpc an ist. Das heißt, dass wir eine If-Abfrage brauchen.

<?php
    
if(get_magic_quotes_gpc()) {
        
// wenn magic_quotes_gpc auf 1 steht

        // mach was um die Slashes wieder wegzumachen.
    
}
?>

Mit der Funktion stripslashes löschen wir die Backslashes aus einem String, die vor einem ', " oder \ stehen.

<?php
    
if(get_magic_quotes_gpc()) {
        
// wenn magic_quotes_gpc auf 1 steht

        
foreach($_POST as $key => $value) {
            
$_POST[$key] = stripslashes($value);
        }
    }
?>

Diese If-Abfrage sollte man in der index.php sehr weit oben hinschreiben, denn das Problem besteht bei jedem Formular und nicht nur beim Gästebuch. Es gibt dabei einen besseren Code, der auch bei Unterarray von $_POST Funktioniert.

<?php
    
function array_stripslashes(&$var)
    {
        if(
is_string($var)) {
            
$var = stripslashes($var);
        } else {
            if(
is_array($var)) {
                foreach(
$var AS $key => $value) {
                    
array_stripslashes($var[$key]);
                }
            }
        }
    }
?>

Diese Funktion schreib man besten in die Datei function.php, die ja von der config.php includet wird. Die index.php müssen wir auch noch anpassen.

<?php
    error_reporting
(E_ALL);
    include
'inc/config.php'; // die Konfigurationsdateien lesen.

    
if(get_magic_quotes_gpc()) {
        
array_stripslashes($_GET);
        
array_stripslashes($_POST);
        
array_stripslashes($_COOKIE);
    }

    
// ...
?>

Was die Funktion jetzt macht, können manche bestimmt nicht nachvollziehen. Das braucht ihr aber erstmal nicht zu wissen. Hauptsache die Funktion löscht die Backslashes vor ', " und \. Diese Funktion und diese If-Abfrage kann man auch in seinen anderen Projekten benutzen.

Zuerst gucken wir ob alle wichtigen Daten aus dem Formular angekommen sind. Man hätte ja auch ein eigenes Formular schreiben und dieses abschicken können.

<?php
    
if(!isset($_POST['Name'], $_POST['Email'],
              
$_POST['Homepage'], $_POST['Text'])) {
        die(
"Bitte Benutzen sie das Formular aus dem Gästebuch\n");
    }
?>

Dann sollten wir überprüfen, dass im Feld Name und Text etwas drinsteht. Die anderen beiden Felder können leergelassen werden.

<?php
    
if(!isset($_POST['Name'], $_POST['Email'],
              
$_POST['Homepage'], $_POST['Text'])) {
        die(
"Bitte Benutzen sie das Formular aus dem Gästebuch\n");
    }

    if(
trim($_POST['Name']) == "") {
        die(
"Bitte geben sie einen Namen ein");
    }
    if(
trim($_POST['Text']) == "") {
        die(
"Bitte geben sie einen Text ein");
    }
?>

Wir bauen nun unseren Query zusammen. Den füllen wir dann mit den Werten aus dem Formular.

<?php
    
if(!isset($_POST['Name'], $_POST['Email'],
              
$_POST['Homepage'], $_POST['Text'])) {
        die(
"Bitte Benutzen sie das Formular aus dem Gästebuch\n");
    }

    if(
trim($_POST['Name']) == "") {
        die(
"Bitte geben sie einen Namen ein");
    }
    if(
trim($_POST['Text']) == "") {
        die(
"Bitte geben sie einen Text ein");
    }

    
$sql = "INSERT INTO gaestebuch
                (Name, Email, Homepage, Inhalt, Datum)
            VALUES
                ('"
.$_POST['Name']."',
                '"
.$_POST['Email']."',
                '"
.$_POST['Homepage']."',
                '"
.$_POST['Text']."',
                NOW())"
;
?>

Doch dies ist so, wie es da steht, eine riesige Sicherheitslücke. Man darf NIE Daten aus der URL oder aus dem Formular direkt in eine Datenbank speichern lassen. Man muss die Eingaben immer prüfen und ggf. bestimmte Zeichen löschen oder bearbeiten. Denn ohne solche Überprüfungen ermöglichen wir Hacker die Möglichkeit für XSS. Deswegen müssen wir einmal die HTML-Zeichen wie < und > umwandeln. Dies machen wir mit htmlspecialchars.

<?php
    
if(!isset($_POST['Name'], $_POST['Email'],
              
$_POST['Homepage'], $_POST['Text'])) {
        die(
"Bitte Benutzen sie das Formular aus dem Gästebuch\n");
    }

    if(
trim($_POST['Name']) == "") {
        die(
"Bitte geben sie einen Namen ein");
    }
    if(
trim($_POST['Text']) == "") {
        die(
"Bitte geben sie einen Text ein");
    }

    
$sql = "INSERT INTO gaestebuch
                (Name, Email, Homepage, Inhalt, Datum)
            VALUES
                ('"
.htmlspecialchars($_POST['Name'])."',
                '"
.htmlspecialchars($_POST['Email'])."',
                '"
.htmlspecialchars($_POST['Homepage'])."',
                '"
.htmlspecialchars($_POST['Text'])."',
                NOW())"
;
?>

Desweiteren müssen wie noch die Zeichen ' " und \ escapen lassen, heißt wir müssen da ein \ vorschreiben lassen.

"Hä? Wir haben sie doch grad entfernt. Warum habe ich die denn jetzt weggemacht wenn wir sie wieder hinzufügen?". Nehmen wir mal an wir benutzen kein stripslashes(). Wenn magic_quotes an ist ist ja alles gut. Dann hat PHP für uns vorsorglich die Zeichen escapet. Doch was ist wenn PHP das nicht macht? Denn ob PHP dies macht oder nicht hängt von der php.ini Datei ab. Und wenn er es nicht macht, dann kann dies den ganzen MySQL-Query zerhauen. Denn dann ist das sowas wie eine " ohne \ in einem PHP-String, welcher mit " startet und endet. Also, lieber Vorsicht als Nachsicht.

Aus diesem Grund müssen wir die Funktion addslashes. Der Name der Funktion zeigt schon was sie macht. Mit ihr bearbeiten wir den Rückgabewert von htmlspecialchars($_POST['xy']).

<?php
    
if(!isset($_POST['Name'], $_POST['Email'],
              
$_POST['Homepage'], $_POST['Text'])) {
        die(
"Bitte Benutzen sie das Formular aus dem Gästebuch\n");
    }

    if(
trim($_POST['Name']) == "") {
        die(
"Bitte geben sie einen Namen ein");
    }
    if(
trim($_POST['Text']) == "") {
        die(
"Bitte geben sie einen Text ein");
    }

    
$sql = "INSERT INTO gaestebuch
                (Name, Email, Homepage, Inhalt, Datum)
            VALUES
                ('"
.addslashes(htmlspecialchars($_POST['Name']))."',
                '"
.addslashes(htmlspecialchars($_POST['Email']))."',
                '"
.addslashes(htmlspecialchars($_POST['Homepage']))."',
                '"
.addslashes(htmlspecialchars($_POST['Text']))."',
                NOW())"
;
?>

Diesen Query können wir jetzt mit mysql_query() senden.

<?php
    
if(!isset($_POST['Name'], $_POST['Email'],
              
$_POST['Homepage'], $_POST['Text'])) {
        die(
"Bitte Benutzen sie das Formular aus dem Gästebuch\n");
    }

    if(
trim($_POST['Name']) == "") {
        die(
"Bitte geben sie einen Namen ein");
    }
    if(
trim($_POST['Text']) == "") {
        die(
"Bitte geben sie einen Text ein");
    }

    
$sql = "INSERT INTO gaestebuch
                (Name, Email, Homepage, Inhalt, Datum)
            VALUES
                ('"
.addslashes(htmlspecialchars($_POST['Name']))."',
                '"
.addslashes(htmlspecialchars($_POST['Email']))."',
                '"
.addslashes(htmlspecialchars($_POST['Homepage']))."',
                '"
.addslashes(htmlspecialchars($_POST['Text']))."',
                NOW())"
;

    
mysql_query($sql) OR die(mysql_error());

    echo
"<p>Vielen Dank für ihren Eintrag.</p>\n";
    echo
"<p><a href=\"index.php?section=gb\">Zurück ins Gästebuch</a></p>\n";
?>

Nun ist unser erstes Gästebuch fertig. Man muss nicht vergessen, dass man die 3 Dateien (gb.php, gb_add.php und gb_insert.php, je nach dem wie die Dateien heißen) im Array $dateien einbindet.

6. Nachteile vom diesem Gästebuch

Wir haben hier zwar ein paar XSS Schutzmechanismen eingebaut, aber das wichtigste Fehlt, und zwar der Spam-Schutz. Denn jetzt könnte man im Browser auf "Zurück" klicken und das Formular neu abschicken. Und dies kann man sogar mit einem Programm machen und schon wird das Gästebuch vollgespammt von sinnlosen Einträgen, nur um den Webmaster zu nerven.

Desweiteren hat dies auch wieder keine Blätterfunktion, keine UBB-Funktion und kein Adminbereich. Falls also ein User gespammt hat, so muss man die Datensätze mit PHPMyAdmin löschen. Man sollte dieses Gästebuch nicht benutzen. Dieses Script soll nur zeigen, wie man aus einem Formular die Daten in eine Datenbank speichern kann.

Fragen zum aktuellen Thema

  1. Wie lösche ich Backslashes vor bestimmten Zeichen?
  2. Wie prüfe ich ob der Inhalt einer Variable leer ist?
Wie lösche ich Backslashes vor bestimmten Zeichen?

Mit der Funktion stripslashes kann man vor bestimmten Zeichen aus einem String die Backslashes löschen. Dies braucht man wenn PHP mittels der Einstellung magic_quotes_gpc die Strings aus GET, POST und COOKIE umwandelt.

Wie prüfe ich ob der Inhalt einer Variable leer ist?

Wenn man den Rückgabewert von trim auf Gleichheit mit "" prüft, weiß man ob die Variable leer ist oder nicht. Man sollte auch noch ein Blick auf die Funktion empty werfen.

Nach oben