1. Was sind Formulare?
Viele Internetseiten bieten Bereiche an in denen ein Text eingegeben oder eine Auswahl
getroffen werden kann. Danach muss man dann üblicherweise auf einen Buttom Absenden
klicken. Solche Stellen werden Formulare genannt. Dabei werden die Eingaben
und Auswahlfelder an ein PHP-Skript gesendet. Dieses PHP-Skript kann dann darauf entsprechend
reagieren, wie z.B. einen neuen User hinzufügen oder ein Newsbeitrag bearbeiten.
2. Formulare in HTML-Dokumenten
Wie bekannt
werden Formulare mit dem HTML-Element <form>
erzeugt. Das action
-Attribut
gibt dabei die URL an, an der das Formular gesendet werden soll, in unserem Fall also
stehts ein PHP-Skript. Dieses Skript wird dann mit den Daten des Formulars aufgerufen, es wird
also zu dieser Seite weitergeleitet.
Mit dem method
-Attribut gibt man an auf welcher Art und Weise die Formulardaten gesendet werden.
Mit dem Wert get
wird die URL mit der GET-Methode aufgerufen. Dies
entspricht einem normalen Aufruf wie die Eingabe einer URL im Browser. Die Daten aus dem Formular
werden dabei an die URL angehängt. Da bei dieser Variante die URL mit den ganzen Daten überladen wirkt
(abgesehen davon dass jede Eingabe, auch Passwörter, sichtbar ist) wird üblicherweise der Wert
post
für das Attribut verwendet. Hierbei werden die Formulardaten versteckt in dem HTTP-Request
übermittelt. Die Daten selbst bleiben zwar weiterhin lesbar (sind also nicht verschlüsselt oder ähnliches),
sind aber für den Benutzer nicht zu sehen. So wird z.B. die URL http://www.example.com/login.php
für den Benutzer normal aufgerufen, die Formulardaten werden dabei versteckt übermittelt.
3. Verarbeitung in PHP
Damit auf die Formularfelder in PHP zugegriffen werden kann müssen alle Formularfelder ein
name
-Attribut besitzen. Im PHP-Skript sind die Formulardaten dann in den Superglobalen
Arrays $_GET
oder $_POST
abgelegt, je nach dem welche Methode im
method
-Attribut angegeben wurde. Der Schlüssel eines Arrayelements ist dabei der
gewählte Namen im Formular, der Wert des Arrayelements wird dann mit dem Wert des Formularelements
gefüllt.
Der Name des Formularfeldes kann dabei ein Arrayelement beschreiben. Wenn das Attribute
name="foobar[5]"
verwendet wird so erzeugt PHP automatisch das passende Array
$_POST['foobar'][5]
mit dem entsprechenden Wert. Wenn der Index weggelassen wird
(name="foobar[]"
) wird auch ein Arrayelement erzeugt, so als würde man in PHP
$array[] = "wert";
schreiben. Dies wird bei Checkboxen verwendet, wo alle
Werte von den Checkboxen in ein Array gespeichert werden.
4. Texteingabefelder
Für einzeilige Texteingabefelder wird das HTML-Element <input>
verwendet. Für
einfache Texteingaben wird das Attribute type="text"
verwendet, für Passworteingaben
wird das Attribut type="password"
verwendet. Für mehrzeilige Texteingaben (wie z.B.
Formularbeiträgen) wird hingegen das <textarea>
-Element verwendet.
<form action="script.php" method="post"> <fieldset> <legend>Logindaten eingeben</legend> <label>Benutzername: <input type="text" name="Username" /></label> <label>Password: <input type="text" name="Pass" /></label> <input type="submit" name="formaction" value="Einloggen" /> </fieldset> </form>
Wenn das Formular abgeschickt wird erzeugt das PHP-Skript das folgende $_POST
-Array.
<?php
$_POST['Username'] = /* Eingabe vom Username-Feld */;
$_POST['Pass'] = /* Eingabe vom Password-Feld */;
$_POST['formaction'] = 'Einloggen'; // der Wert wurde durch value="" vorgeschrieben.
?>
5. Dropdownlisten
Dropdownlisten werden mit dem HTML-Elementen <select>
und <option>
erzeugt. Wenn das Attribut multiple="multiple"
verwendet wird sollte der
Name der Dropbox auf []
enden, damit für alle gewählten Listeneinträge entsprechend
ein Arrayelement erzeugt wird.
<form action="script.php" method="post"> <fieldset> <legend>Formular für Foobar</legend> <label>Name: <select name="Benutzername"> <option value="1">Blabli</option> <option value="4">Testuser</option> </select></label> <label>Rechte: <select name="Rechte[]" multiple="multiple" size="5"> <option value="1">News</option> <option value="2">Forum</option> <option value="3">Gästebuch</option> </select></label> <input type="submit" name="formaction" value="Abschicken" /> </fieldset> </form>
Wenn in dem Formular der Benutzer Blabli
und die Rechte
News
und Gästebuch
ausgewählt werden so werden im
PHP-Skript folgende Arrayelemente erzeugt.
<?php
$_POST['Benutzername'] = "1";
$_POST['Rechte'][] = "1"; // also $_POST['Rechte'][0] = "1"
$_POST['Rechte'][] = "3"; // also $_POST['Rechte'][1] = "3"
$_POST['formaction'] = "Abschicken";
?>
6. Radio- und Checkboxen
Für Radio- und Checkboxen werden <input>
-Elemente verwendet.
Je nach dem welchen Typ man haben möchte wählt man type="radio"
oder type="checkbox"
. Damit die Radiobuttons bzw. die Checkboxen genau so
funktionieren soll wie man es erwartet sollten die Radiobuttons bzw. die Checkboxen
den selben Namen besitzen. Bei Checkboxen sollte der Name wieder auf []
enden damit für jede Auswahl ein Arrayelement erzeugt wird, sonst würde nur
die letzte Auswahl in PHP gespeichert werden.
<form action="script.php" method="post"> <fieldset> <legend>Pizza auswählen</legend> <fieldset> <legend>Größe</legend> <label><input type="radio" name="Size" value="20" /> Klein</label> <label><input type="radio" name="Size" value="24" /> Mittel</label> <label><input type="radio" name="Size" value="30" /> Groß</label> </fieldset> <fieldset> <legend>Belag</legend> <label><input type="checkbox" name="Belag[]" value="Schinken" /> Schinken</label> <label><input type="checkbox" name="Belag[]" value="Salami" /> Salami</label> <label><input type="checkbox" name="Belag[]" value="Thunfisch"> Thunfisch</label> </fieldset> <input type="submit" name="formaction" value="Bestellen" /> </fieldset> </form>
Wenn hier eine mittlere Pizza mit Schinken und Thunfisch ausgewählt wird so werden im PHP-Skript folgende Arrayelemente erzeugt.
<?php
$_POST['Size'] = "24";
$_POST['Belag'][] = "Schinken";
$_POST['Belag'][] = "Thunfisch";
$_POST['formaction'] = "Bestellen";
?>
Wenn bei den Formularfeldern für Radio- und Checkboxen keine Wert angegeben werden
so wird bei einem ausgewählten Feld der Wert on
übergeben. Wenn
das Element nicht ausgewählt wird (wie hier die Zutat Salami) wird gar nichts gesendet.
7. Traue niemanden
Wie bei GET-Variablen kommen bei einem Formular die Daten von außen in das PHP-Skript. Daher
können diese Variablen mit jeden beliebigen Wert gefüllt werden, oder auch gar nicht erst
gesendet werden. In den PHP-Skripten muss entsprechend darauf geachtet werden ob die
Variablen gefüllt sind und mit was. Um zu gucken ob ein Formularfeld vorhanden war kann
man wie gewohnt die isset-Funktion verwenden und damit die Arrayelemente vom
$_POST
-Array prüfen. Somit kann man schonmal prüfen ob alle Formularelemente
in dem Formular vorhanden waren.
<?php
if (!isset($_POST['name'], $_POST['password'])) {
die ('Benutzen sie nur Formulare von der Homepage.');
}
?>
Der Inhalt kann dann mit String-Funktionen überprüft werden.
8. Magic Quotes
Wenn die (Text-)Daten aus dem Formular an das PHP-Skript gesendet werden kann es
sein dass diese Daten, je nach Inhalt, leicht verändert werden. So wird
aus dem Text Ein Text mit einem ' und einem "
der Text
Ein Text mit einem \' und einem \"
. Dieses Verhalten wird
Magic Quotes genannt. Damit werden
Anfänger unter die Arme gegriffen die Texteingaben ungeprüft in
SQL-Queries verwenden.
Dieses Verhalten kann jedoch störend sein, insbesonde dann wenn Texte wie
Ein Text mit einem \\\\\\\' und einem \\\\\\\"
entstehen, da man nicht
weiß wie man mit magic quotes richtig umgeht. Daher löschen
wir diese Backslashes mit stripslashes wieder falls
magic quotes aktiviert ist. Dies geht am sichersten mit
folgendem Programmcode.
<?php
if (get_magic_quotes_gpc()) {
$in = array(&$_GET, &$_POST, &$_COOKIE);
while (list($k,$v) = each($in)) {
foreach ($v as $key => $val) {
if (!is_array($val)) {
$in[$k][$key] = stripslashes($val);
continue;
}
$in[] =& $in[$k][$key];
}
}
unset($in);
}
?>
Diesen PHP-Code von http://talks.php.net/show/php-best-practices/26
muss man nicht verstehen aber er sorgt dafür dass in den $_GET
-,
$_POST
- und $_COOKIE
-Arrays die Backslashes gelöscht werden die
durch magic quotes entstanden sind. Diesen Code werden wir dann
für unsere Skripte verwenden.