IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - PHP: Formulardaten verarbeiten



PHP: Formulardaten verarbeiten

Eine Auflistung der verschiedenen Arten von Formular-Elementen und wie PHP diese verarbeitet.


Autor: Patrick Faes (dreamer)
Datum: 05-09-2005, 08:02:33
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 60266x
Rating: 9.5 (2x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einführung

Formulare ermöglichen es dem Besucher große Mengen an Daten in den verschiedensten Sorten an einen Server zu schicken. Denken Sie nur an Webmail, Datei-Upload o.ä. Die per Formular abgeschickten Daten werden vom Server aber anders behandelt, was heißt die Syntax ist unterschiedlich je nach Typ des Formular-Elements.

Dieser Artikel möchte zeigen wie die verschiedenen Formular-Elemente vom Server abgearbeitet werden und vor allem wie die Formular-Elemente korrekterweise in HTML erstellt werden müssen. Dieser Artikel spricht dabei aber nur die für diesem Zweck wichtigsten Punkte an. Für eine komplette Übersicht ist SelfHTML.org zu empfehlen.

Obwohl die hier gezeigten Code-Beispiele auf PHP basieren, könnte dieser Artikel auch für Scripter einer anderen Sprache (wie z.B. ASP, JSP oder Perl) lesenswert sein.

Ein Formular definieren

Alle Elemente eines Formulars werden zwischen den Tags <FORM> und </FORM> geschrieben. Für uns sind jetzt nur zwei mögliche Attribute von Interesse, nämlich ACTION und METHOD. Formulare können in HTML ebenso wie ihre Elemente ein NAME-Attribut haben. Bei den Elementen dient das NAME-Attribut dazu die Variable zu identifizieren. Der Name des Formulars an sich wird von PHP aber nicht beachtet. Daher wird auch nicht darauf eingegangen.

Das Action-Attribut ist das Script an dem die Daten übertragen werden müssen (wird oft verwechselt mit TARGET, das das Zielfenster beinhaltet). Es kann passieren, dass das Formular sich auf derselben Seite befindet wie das Script das die Daten verarbeiten muss. In dem Fall wird die globale PHP-Variable $_SERVER['PHP_SELF'] (Schriftgröße beachten!) verwendet.

Beispiel:
   <form action="<?php print $_SERVER['PHP_SELF']; ?>">
Das zweite Attribut das uns interessiert, ist das Attribute METHOD. Dieses enthält die Methode mit der die Daten am Server geschickt werden. Es gibt zwei Methoden: GET und POST. Beachten Sie, dass wenn Sie die Methode nicht explizit deklarieren manche Browser die Formulardaten automatisch per GET-Methode versenden, was aber nicht sein darf. Die GET-Methode ist die Methode die auch für normale Links verwendet wird. Dabei werden die Variablen am der URL angehängt.

Beispiel: www.IT-Academy.cc?var1=wert1&var2=wert2

Die Anzahl der Daten die per GET-Methode versendet werden können ist aber ziemlich stark begrenzt. Zudem gibt es noch weitere Probleme wenn die Daten z.B. aus einer Checkbox stammen. Die GET-Methode ist daher für der Verwendung mit Formularen keineswegs geeignet.

Mit der POST-Methode werden die Daten unsichtbar (sie stehen nicht in der URL) im Header an den Server gesendet.

Beispiel:
<form method="post">
Die Daten die per POST-Methode sind ab PHP 4.1 automatisch als globale Variable verfügbar in $_POST (ist ein Array). Ältere Versionen verwenden dazu die Variable $HTTP_POST_VARS.

Textfelder verarbeiten

Die wohl wichtigste Kategorie von Formular-Elemente bilden die Textfelder. Es gibt dabei zwei große Unterkategorien: einzeilige und mehrzeilige Eingabefelder.

Beispiel eines einzeiligen Formularfelds:
   <input type="text" size="15" name="Vorname">


Beispiel eines mehrzeiligen Eingabefelds:
   <textarea rows="8" cols="20" name="Nachricht"></textarea>

 
Für beide ist minimal das Attribut NAME notwendig. Das INPUT-Element hat in diesem Fall den Typ TEXT, wobei auch es noch die Variante PASSWORD gibt. Dabei werden alle Zeichen als * angezeigt.

PHP erkennt die Variablen aus diese Feldern über den Namen. Sie werden gespeichert in der Variablen $_POST. Sie wären in diesem Beispiel ansprechbar über $_POST['Vorname'] und $_POST['Nachricht']. Es ist auch möglich um mehrere Textfelder mit dem selben Namen zu erstellen. PHP wird die Daten dann als eine Array speichern. Das ist z.B. nützlich wenn jemand drei Antworten zu einer Frage geben muss.

Dazu muss aber den Namen wie folgt vergeben werden:
   <input name="Antwort[]">
   <input name="Antwort[]">
   <input name="Antwort[]">
Diese sind dann nachher in einem Array wie folgt verfügbar:
   $_POST['Antwort'][0]; //Antwort 1
   $_POST['Antwort'][1]; //Antwort 2
   $_POST['Antwort'][2]; //Antwort 3
Nach dem selben Muster wird auch zugegriffen auf versteckte Felder (vom Typ HIDDEN). Die Felder sind unsichtbar für den Besucher und werden oft verwendet mit JavaScript oder um Daten über verschiedene Seiten mit zu nehmen. Dabei werden die Daten per PHP in das Attribut VALUE geschrieben (mehr dazu).

Beachten Sie auch, dass ein Textfeld immer mit dem Formular verschickt wird, auch wenn es leer ist. Mit PHP kann man dann später testen ob das Textfeld leer war.
   if (empty($_POST['Antwort']))
   {//ergibt true wenn das Textfeld leer war}
Radio-Buttons

Mit Radio-Buttons arbeiten ist leicht. Diese ermöglichen es aus einer Reihe von Optionen einen einzigen zu selektieren.

Ein Beispiel:

Option 1
Option 2
Option 3
Option 4

Der korrekte HTML-Code für eine solche Gruppe von Radio-Buttons sieht so aus:
   <input type="radio" name="wahl" value="wert1">Option 1</input>
   <input type="radio" name="wahl" value="wert2">Option 2</input>
   <input type="radio" name="wahl" value="wert3">Option 3</input>
   <input type="radio" name="wahl" value="wert4">Option 4</input>
In einem Formular werden alle Radio-Buttons mit dem selben Namen gruppiert, in diesem Fall "wahl". Jedes muss aber einen eigenen VALUE-Attributen haben. PHP erkennt die Variable dann wie folgt:
   $_POST['wahl'];
Die Variable kann nur einen Wert haben.

Checkboxen

Checkboxen sind kleine Kästchen die der Surfer markieren kann.
Beispiel:

Option 1
Option 2

Der große Unterschied zu Radio-Buttons ist dass Checkboxen unabhängig von einander sind, auch von gleichnamige Checkboxen. Außerdem unterscheiden sich Checkboxen gegenüber Radio-Buttons in der Handhabung des VALUE-Attributen.

PHP kann wie folgt testen ob eine Checkbox markiert wurde:
   if (isset($_POST['checkboxname']))
   {
   //die Variable würde es nicht geben wenn die Checkbox nicht markiert wurde
   }
   if ($_POST['checkboxname'] == 'on')
   {
   //Checkboxen die markiert wurden, übermitteln automatisch den Wert "on",
   //es sei denn das VALUE-Attribut beinhalten einen anderen Wert
   }
Hiermit kann eine Checkbox als Boolean-Wert behandelt werden. Jedoch ergbit diese dann nicht true, sondern on. Damit kann z.B. die Verwendung anderer Formular-Elementen davon abhängig gemacht werden. Dazu reicht dann folgender HTML-Code:
   <input type="checkbox" name="checkboxname">
Wenn eine Checkbox aber ein eigenes VALUE-Attribut hat, dann wird dieser Wert ermittelt. Jedoch ist der Wert dann schon vorher bekannt und macht es wohl wenig Sinn den Wert zu überprüfen. Eine sinnvollere Methode ist dagegen die Verwendung eines Arrays, wobei alle Checkboxe Teil dieser Array sind.

Nehmen wir als Beispiel eine Webseite eines Pizza-Bäckers. Auf der Webseite kann man dann die Zutaten der Pizza wählen:

"Bitte wählen Sie Ihre Zutaten:"
Salami
Fisch
extra Käse

Der Code sehe dann so aus:
   <input type="checkbox" name="zutaten[]" value="salami">Salama</input>
   <input type="checkbox" name="zutaten[]" value="fisch">Fisch</input>
   <input type="checkbox" name="zutaten[]" value="extra_kaese">extra Käse</input>
Auch wenn nur eine einzige Checkbox markiert wurde, wird PHP die Variable dann immer als Array behandeln (dazu müssen aber rechteckige Klammern hinter den Namen der Checkboxen stehen).

Submit-Buttons

Ein Submit-Button dient dazu ein Formular abzuschicken. Jedoch wissen nur die wenigsten, dass PHP auch diese Auslesen kann.

Mit dem VALUE-Attribut setzen Sie hierbei die Beschriftung des Buttons.
   <input type="submit" value="Beschriftung" name="abschicken">


Wenn Sie nun z.B. mehrere gleichnamige Submit-Buttons haben, kann PHP mit einer Fall-Unterscheidung testen was der Besucher machen möchte. Damit werden doppelte Formulare überflüssig.

So wäre es z.B. möglich, dass ein Surfer sich für einem Newsletter einträgt. Mit dem selben Formular könnte man es den Besucher ermöglichen sich wieder auszutragen. Dazu müssen dann zwei Submit-Buttons erstellt werden mit gleichen Namen, aber mit einem unterschiedlichen VALUE-Attribut (diese beiden werden oft verwechselt).
   <input type="submit" name="abschicken" value="eintragen">
   <input type="submit" name="abschicken" value="austragen">


Die Fall-Unterscheidung per PHP könnte dann so aussehen:
   if ($_POST['abschicken'] == 'eintragen')
   {}
   elseif ($_POST['abschicken'] == 'austragen')
   {}
Auswahllisten

Auswahllisten gibt es in zwei Formen:

  

Bei Formen werden mit dem SELECT-Tag erstellt. Mit dem Attribut SIZE wird bestimmt wieviele Optionen gleichzeitig gezeigt werden können. Wenn dieses Attribut den Wert "1" hat, bekommen Sie ein Drop-Down-Menü. Ansonsten bekommen Sie eine Box zu sehen in der genau soviele Optionen sichtbar sind wie im Attribut SIZE angegeben. Wenn die Box mehr Optionen enthält als im Attribut SIZE angegeben, wird ein Schiebebalken sichtbar. Der HTML-Code sieht wie folgt aus:
   <select size="3">
   <option>Option 1</option>
   <option>Option 2</option>
   <option>Option 3</option>
   <option>Option 4</option>
   <option>Option 5</option>
   </select>
Der Absendewert einer Auswahlliste ist der Text des gewählten Elements, genauer gesagt der Text der zwischen den OPTION-Tags steht. Allerdings ist es auch hier möglich einen alternativen Absendewert zu verwenden. Dazu muss die Option ein VALUE-Attribut haben.
   <select size="2" name="Boxname">
   <option value="absendewert">Option 1</option>
   <option>Option 2</option>
   </select>
Die Variable wird dann in PHP verfügbar sein (in diesem Beispiel) als $_POST['Boxname'].

Es ist auch möglich um in eine Auswahlliste mehrere Optionen gleichzeitig zu selektieren. Dazu reicht es aber nicht rechteckige Klammern nach dem Namen zu setzen. Zusätzlich muss noch die Option multiple im Anfangstag geschrieben werden (um XHTML-konform zu sein, muss es aber multiple="multiple" sein).
   <select name="Boxname[]" multiple>
Dabei können Sie dann mit gedrückt gehaltener STRG-Taste mehrere Elemente selektieren (dies ist für dem Besucher allerdings nicht sichtbar, Sie sollten ihn deshalb darauf hinweisen). Die abgeschickten Werten sind dann in einem Array verfügbar.

Wenn Sie aber die Option multiple nicht explizit aufnehmen, dann wird kein Array verschickt, sogar wenn der Namen rechteckige Klammern hat. Die Klammern sorgen nur dafür, dass alle Formular-Elemente mit demselben Namen gruppiert werden. Ein Textfeld mit dem Namen "Feld" und eine Auswahlliste der auch den Namen "Feld" trägt, würden also ihre Werte im selben Array am Server schicken. Dafür wäre dann aber die Superglobale in Verbindung mit einer foreach()-Schleife besser geeignet.

Felder für Datei-Upload

Ein Feld um eine Datei hochzuladen erstellen Sie wie folgt:
   <input type="file">


PHP speichert die hochgeladene Datei im Verzeichnish "temporäre Dateien" (meistens /var/temp/ ). Während der Ausführung des Scripts sind in einem Array verschiedene Daten zu der Datei verfügbar.
  1. "name": Name unter der die Datei beim Besucher gespeichert ist
  2. "tmp_name": Name unter der die Datei zeitlich beim Server gespeichert ist
  3. "type": gibt den Dateityp im MIME-Format (z.B. "image/gif")
  4. "size": beinhaltet die Dateigröße gemessen in Bytes
  5. "error" (ab PHP 4.2): enthält einen Fehlercode beim Fehlschlag, ansonsten "OK"
Ein Datei-Feld muss immer einen Namen haben um diesen verwenden zu können. Dabei gibt es auch hier die Möglichkeit mehrere Felder mit dem selben Namen zu erstellen.
   <input type="file" name="Datei">

   <?php
   $_FILES['Datei']['name'];
   $_FILES['Datei']['tmp_name'];
   $_FILES['Datei']['type'];
   $_FILES['Datei']['size'];
   $_FILES['Datei']['error'];
   ?>
Wenn die Upload-Felder den selben Namen haben, dann wird die Superglobale $_FILES um eine Dimension erweitert.
   <input type="file" name="Datei[]">
   <input type="file" name="Datei[]">
   <input type="file" name="Datei[]">

   <?php
   $_FILES['Datei']['name'][2];
   $_FILES['Datei']['tmp_name'][2];
   $_FILES['Datei']['type'][2];
   $_FILES['Datei']['size'][2];
   $_FILES['Datei']['error'][2];
   ?>
Als letztes sollen Sie noch beachten, dass eine Datei hochladen nur per POST-Methode funktioniert und Sie zudem im FORM-Tag das Attribut ENCTYPE auf multipart/form-data setzen.


dreamer
Expert
Beitrag vom:
08-10-2005, 20:15:11

Schleifen bei Datei-Upload

Es gibt Probleme dabei eine Schleife zu verwenden in Zusammenhang mit dem Hochladen mehrerer Dateien.

Normalerweise verwendet man in PHP die For-Schleife wann bekannt ist wie oft die Schleife durchlaufen werden soll (nämlich genauso viele Male wie es hochgeladene Dateien gibt):

for ($i = 0; $i < count($_FILES['datei']); $i++)
{$_FILES['datei']['tmp_name'][$i];}

Jedoch kann PHP dabei anscheinend die Dimensionen der Array nicht richtig zählen. Deshalb soll folgende Schleifenkonstruktion verwendet werden:

$i = 0;
while (is_uploaded_file($_FILES['datei']['tmp_name'][$i]))
{
$_FILES['datei']['tmp_name'][$i];
$i++;
}

-----------------------------------------------------


picard
Professonial
Beitrag vom:
04-09-2005, 10:55:27

hmm...

irgend etwas passt beim Bearbeiten des Artikels nicht, daher hoffe ich, dass es vollständig ist. Mal sehen ob ich den Fehler finde - hat aber irgend etwas mit der mehrzeilen Textarea zu tun...

-----------------------------------------------------
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06246
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1154
Comments: 0