PHP/Daten aus einem Formular ermitteln

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Das Formular

HTML-Formulare sind der Weg, auf dem Daten vom Webbrowser zum Webserver und damit zu einem PHP-Skript gelangen können. Ein Formular besteht aus dem "<form>"-Tag mit verschiedenen Parametern und den Feldelementen, HTML-Tags zur Darstellung von Eingabefeldern. HTML-Eingabefelder können nur innerhalb des "<form>"-Behälters existieren. Ausserhalb werden sie je nach Webbrowser nicht oder falsch dargestellt; funktionslos sind sie dort auf jeden Fall. Das folgende einfache Beispiel sendet eine E-Mail. Der gesamte Prozess läuft allerdings clientseitig ab. Voraussetzung ist, dass neben dem Webbrowser auch ein E-Mail-Client installiert ist, der vom Browser auch gesteuert werden kann.

<html>
<head><title>Mailformular</title></head>
<body>
<form action="mailto:email@domain.xx">
  Nachricht: <input type="text" name="Message"      size="50">
  E-Mail:    <input type="text" name="Emailaddress" size="50">
</form>
</body>
</html>

Kann der E-Mail-Client nicht vom Webbrowser gesteuert werden, so ist ein Skript auf dem HTTP-Server notwendig, das unabhängig vom Browser und dessen Installationsumgebung E-Mails verschicken kann. Praktisch ist dazu nur eine Zeile auszutauschen. Als auszuführender Befehl für das "<form>"-Tag wird damit nicht mehr eine lokale Anweisung gegeben, sondern ein Skript auf dem Server. Zum anderen wird ausdrücklich auf die zu verwendende Datenübertragungsmethode "post" gezeigt.

<form action="sendmail.php" method="post">

Browserseitig können Formulare ausgewertet und der Inhalt der Felder beeinflusst werden, indem eine Skriptsprache eingesetzt wird, die der Browser versteht (z. B. JavaScript).

Folgende Tabelle zeigt eine Übersicht aller in HTML erlaubten Feldelemente innerhalb des "<form>"-Tags.

Elementtyp Beschreibung Attribute
text Einzeiliges Eingabefeld name, size, value
checkbox Kontrollkästchen checked, name, value
radio Optionsschaltfläche checked, name, value
submit Sendeschalter name, value
reset Rücksetzschalter name, value
password Verdecktes Eingabefeld name, size, value
hidden Unsichtbares Feld name, value
button Schaltfläche name, value
image Bild, ersetzt "submit" name, src; Bildattribute
file Eingabefeld und Schalter accept, name
select Container: Werteliste in Form einer Drop-Down-Menüs. Jedes Element wird durch ein "<option>"-Tag eingeleitet.
textarea Container: Mehrzeilige Eingabefelder für Text.

Die Attribute haben folgende Bedeutung.

Attribut Beschreibung
checked Das Element ist aktiv ("checkbox" und "radio").
name Name, nach dem das Element im Skript identifiziert werden kann.
size Länge des Felds in Standardzeichen. Die genaue Ausdehnung hängt von der Schriftart ab.
src Ort, wo sich das Bild befindet.
value Vorbelegter Wert ("hidden", "text") oder Beschriftung ("button", "reset", "submit"). Dieser Wert wird auch gesendet (bei "type='text'" der vom Nutzer gegebenenfalls veränderte Inhalt).

Auswertung

PHP erkennt selbständig angehängte Daten, gleichgültig ob mit "GET" im URI oder mit "POST" im Körepr der Nachricht. Jedes Formularelement ist durch das Attribut "name" gekennzeichnet. Es erscheint in PHP als Element eines Arrays, das die entsprechende Datenquelle enthält. Bei "POST"-Variablen ist dies das Array "$_POST". Dieses sogenannte Superarray ist immer global und in allen Funktionen sichtbar. Im normalen Text wird das Array wie folgt genutzt.

$_POST['name']

In heredoc-Blöcken sieht es etwas anders aus; hier wird PHP durch geschweifte Klammern mitgeteilt, was zur Variablen gehört.

{$_POST['name']}

Durch Bilder erzeugte Schaltflächen übermitteln in den Variablen "$_POST['name_x']" und "$name_y" die Position des Mauszeigers, relativ zur linken oberen Bildecke. Das folgende Beispiel zeigt ein Formular mit normalen Eingabefeldern und Sendeschaltflächen. Das Skript ruft sich selber auf, der Name wird der vorderfinierten Variablen "$_SERVER['PHP_SELF']" entnommen. Es ist zweigeteilt und enthält sowohl das Formular zum Senden als auch das Skript zum Auswerten. Die Erkennung, ob es sich um die Darstellungs- oder Auswertungsphase handelt, wird anhand der Variablen "$_POST['sent']" getroffen; zusätzlich wird über die Variable "$_POST['name']" ausgewertet, ob wenigstens der Name ausgefüllt wurde. Wenn PHP sehr restirktiv eingestellt ist, so sollte mit "isset($_POST['sent'])" auch die Existenz des Elements geprüft werden. Ansonsten wertet PHP gefüllte Variablen (Formularelemente) als "TRUE", ungefüllte oder nicht vorhandene als "FALSE" (automatische Typumwandlung). In der Auswertephase werden die daten wiedergegeben. Das Formular kann erneut aufgerufen werden, indem ein neues Formular gesendet wird, das ausser der Sendeschaltfläche keine Elemente enthält, die nächste Auswertung verzweigt dann wieder in den "else"-Zweig und stellt ein leeres Formular bereit.

<?php
if (isset($_POST['sent']) & isset($_POST['name']))
{
  echo <<<FORMANSWER
  Sie haben folgende Nachricht gesendet:<p />
  <b>Ihr Name:</b>    {$_POST['name']}<br />
  <b>E-Mail:</b>      {$_POST['email']}<br />
  <b>Bewertung:</b>   {$_POST['rank']}<br />
  <b>Ihre Nachricht:</b> <br />
  <div style="background-color:#DDDDDD">{$_POST['message']}</div>
  <b>Gekauft bei:</b> {$_POST['purchase']}
  <form method="post" action="{$_SERVER['PHP_SELF']}">
    <input type="submit" value="Neue Nachricht senden?" />
  </form>
FORMANSWER;
}
else
{
?>
<h3>Wie hat Ihnen das Buch bisher gefallen?</h3>
<form method="post" action="<?=$_SERVER['PHP_SELF']?>">
<table>
  <tr>
    <td>Mein Name:</td>
    <td><input type="text" name="name" size="50" /></td>
  </tr>
  <tr>
    <td>Meine E-Mail:</td>
    <td><input type="text" name="email" size="50" /></td>
  </tr>
  <tr>
    <td>Bewertung:</td>
    <td>1<input type="radio" name="rank" value="1" />
        2<input type="radio" name="rank" value="2" checked="checked" />
        3<input type="radio" name="rank" value="3" />
        4<input type="radio" name="rank" value="4" />
        5<input type="radio" name="rank" value="5" />
        (Schulnoten)
    </td>
  </tr>
  <tr>
    <td valign="top">Nachricht:</td>
    <td>
      <textarea cols="30" rows="6" name="message">Ihre Nachricht...</textarea>
    </td>
  </tr>
  <tr>
    <td>Wo haben Sie es gekauft?</td>
    <td><select size="1" name="purchase">
	  <option value="Fachbuchhandel">Fachbuchhandel</option>
	  <option value="Kaufhaus">Kaufhaus</option>
	  <option value="Online">Online</option>
	  <option value="Verlag">Verlag</option>
	  <option value="Nur geliehen">Nur geliehen</option>
	</select>
    </td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="Absenden" />
                    <input type="reset" />
                    <input type="hidden" name="sent" value="1" /> 
    </td>
  </tr>
</table>
</form>
<?php
}
?>

Formularelemente auf Existenz testen

Im vorigen Beispiel wurde bereits von der Tatsache Gebrauch gemacht, dass nicht vorhandene oder nicht ausgefüllte Formularelemente gezielt ausgewertet werden. Mit "isset" kann ermittelt werden, ob überhaupt Daten übermittelt wurden.

isset($_POST['sent'])

Das Kontrollkästchen ("checkbox") überträgt den Wert des Attributs "value". Wurde "value" nicht angegeben, so wird das aktivierte Kontrollkästchen "on" übertragen. Ein nicht aktiviertes Kontrollkästchen überträgt nichts, nicht einmal den Namen selbst.

Optionsfelder ("radio") dienen der Auswahl aus einer fest begrenzten Wertemenge. Gruppen entstehen, indem mehrere dieser Felder denselben Namen tragen. Wird keines der Felder ausgewählt, erscheint es nicht als Variable. Wird eines ausgewählt, so wird der Wert des Attributs "value" übertragen. Die Angabe eines Werts kann erzwungen werden, indem eine der Optionen mit dem Attribut "checked" versehen wird.

Textfelder in allen drei Varianten ("text", "hidden", "<textarea>") geben immer wenigstens eine leere Zeichenkette und damit auch den Namen zurück. Bei "text" und "hidden" bestimmt der Inhalt des Attributs "value", was standardmässig gesendet wird. Bei "<textarea>" steht der Standardtext zwischen den Tags.

Auswahlboxen ("<select>") können völlig unselektiert bleiben, dann wird auch der Name nicht übertragen. Durch Setzen des Attributs "default" (im "<option>"-Tag) kann aber eine Standardauswahl erzwungen werden.

Die Sendeschaltfläche ("submit") wird nicht übertragen, wenn "value" nicht ausgefüllt wurde. Die Schaltfläche verwendet normalerweise "value" als Bezeichner. Wird nichts angegeben, so erscheint abhängig von der Browsersprache und dem Browser selbst der Standardtext "Submit" oder "Anfrage absenden", dieser wird aber nicht gesendet.