Quakenet/#php Tutorial

Hinweis: Wenn sie diese Seite von einer externen URL aufgerufen haben achten sie darauf das alle Kapitel aufeinander aufbauen. Stellen sie daher sicher dass sie alle vorherigen Kapitel gelesen haben, da sie sonst relevante Informationen übersehen.

Formulare

  1. Was sind Formulare?
  2. Formulare in HTML-Dokumenten
  3. Verarbeitung in PHP
  4. Texteingabefelder
  5. Dropdownlisten
  6. Radio- und Checkboxen
  7. Traue niemanden
  8. Magic Quotes

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.

Fragen zum Kapitel

Keine Fragen zum Kapitel vorhanden

Zurück zu Weiter zu
Copyright © bei den OPs von #php.de/QuakeNet Valid XHTML 1.0 Strict Valid CSS!