PHP lernen – HTML-Formulare auswerten (GET- und POST-Requests)

Heyho,

weiter geht’s mit PHP. Im letzten Artikel hab ich dir gezeigt, was Arrays sind. Praktisch, denn dieses Wissen brauchst du für die Arbeit mit Formularen, vor allem hinsichtlich GET- und POST-Requests. Los geht’s würde ich sagen!

Wie im allerersten PHP-Artikel bereits angekündigt wäre ein Grundwissen in HTML nicht schlecht. Du weißt also vielleicht schon, wie man die Grundstruktur von HTML-Dateien erstellt und bestenfalls auch, wie man Formulare bastelt. Kannst du? Sehr gut, dann lass uns anfangen.

Was sind HTML-Formulare?

HTML-Formulare sind Formulare in denen der Benutzer gewisse Dinge eintragen kann. Eingeleitet wird ein HTML-Formular mittels des form-Tags. Kurzes Beispiel:

Wichtig sind hier die zwei Attribute „method“ und „action“:

  • method Attribut
    Legt die HTTP-Methode fest, in der die Daten an den Server übermittelt werden. Diese kann entweder GET (via Adresszeile) oder POST sein. Entspann‘ dich, das wird gleich noch ausführlich erklärt.
  • action Attribut
    Legt die Datei fest, an die die Daten übermittelt werden. Im Normalfall wird also dort der Pfad und Name zu der PHP-Datei eingetragen, die die übermittelten Daten verarbeitet.

Es gibt mehrere Felder. Je nachdem wofür das Formular bestimmt ist, platziert man entsprechende Felder (man verwendet auch gern den Begriff Steuerelemente, Formelemente oder Feldelemente). Schauen wir mal, was es so gibt:

  • Textfelder
    Denkbar einfach ist die Funktion dieses Feldes – eine stinknormale Textbox, in der der Benutzer beliebigen Text via Tastatur eingeben kann. Zum Beispiel zur Eingabe des Namens, der E-Mail Adresses oder sonstigen Text. Easy.
  • Passwortfeld
    Das gleiche wie ein normales Textfeld, nur dass die Zeichen bei der Eingabe maskiert dargestellt werden, z.B. mit diesen schwarzen Punkten oder auch mit Sternchen. Hast du sicher schonmal gesehen wenn du dein Passwort irgendwo eintippen musstest.
  • Checkboxen
    Das sind diese kleinen viereckigen Kästchen, in denen man per Mausklick einen Haken setzen und wieder rausnehmen kann. Sieht man oft wenn man bei einer Registrierung den AGBs und Nutzungsbedingungen zustimmen muss (die man natürlich sorgfältig durchgelesen hat). Es können auch mehrere Checkboxen vorkommen, zum Beispiel wenn man dem Benutzer beim Kauf eines Neuwagens die Möglichkeit bieten will, die Ausstattung zu wählen (Sportpaket -> Haken rein, Ledersitze … zu teuer, kein Haken, integriertes Navi -> Haken rein und so weiter).
  • Radiobuttons
    Sehen so ähnlich aus wie Checkboxen nur rund. Im Regelfall gibt es immer mehr als einen Radiobutton, von denen man dann quasi eine Option auswählen kann. Zum Beispiel wenn man dem Benutzer beim Kauf mehrere Zahlungsmodelle oder Zahlungsmethoden anbieten möchte. Hier macht es ja nur Sinn, von allen verfügbaren Zahlungsmethoden EINE zu wählen. Entweder also PayPal ODER Überweisung ODER mit Kreditkarte etc…
  • DropDown
    Eine einfache aufklappbare Liste mit Optionen, die gewählt werden können. Je nach Einstellung kann hier optional Mehrfachauswahl aktiviert werden.
  • Mehrzeiliges Texteingabefeld
    Das gleiche wie das normale Textfeld, nur dass es mehrzeilig ist. Es ist also für Fälle gedacht, wenn man mal viel Text schreiben will. Wie z.B. das olbigatorische Nachrichtenfeld dass es in jedem Kontaktformular oder Gästebuch gibt.
    (Wer zur Hölle verwendet noch Gästebücher?)
  • Submit-Button
    Natürlich sehr wichtig – wenn man auf den Submit-Button klickt, wird das Formular abgesendet.
  • Versteckte Felder
    In versteckten Feldern können Informationen und Daten zwischen Seiten transportiert werden, ohne dass der Benutzer es sieht oder ändern kann (doch kann er wenn man’s genau nimmt, aber das kommt später). Auch wenn dir dir grade keine Situation vorstellen kannst in der ein verstecktes Feld sinnvoll wäre, wird sich bald das Gegenteil herausstellen.

Schön, das ist ja gut dass es so viele verschiedene Felder und Eingabemöglichkeiten gibt. Das gibt dir als Entwickler die Möglichkeit, für jeden Anwendungsfall die passenden Steuerelements zu platzieren und so dem Endbenutzer eine intuitive Oberfläche zu bauen. Es gibt noch weitere Felder die unter anderem mit HTML5 eingeführt wurden. Ist jetzt aber nicht so relevant, uns interessiert ja vorrangig, wie wir endlich mit PHP arbeiten können.

Was ist das mit diesem GET und POST?

Gut dass du fragst. GET und POST sind gewissermaßen Übertragungsmethoden, die festlegen, wie die Daten zur Ziel-Datei gelangen.

  • GET-Request
    Die Daten werden via URL übergeben, sind also in der Adresszeile (dort wo man die Webseite im Browser eintippt) sichtbar. Ich kenne kaum Fälle, in denen man Formulare über GET absendet, in der Regel hängt man derlei Parameter an die URL die z.B. in einem Hyperlink steht.
  • POST-Request
    Die Daten werden „im Hintergrund“ übertragen und sind in der Adresszeile nicht sichtbar. POST ist die Standard-Übertragungsmethode und kommt in 99% der Fälle zum Einsatz. POST ist super, um sensible Daten zu transportieren: Kontaktformular, Registrierungs- oder Login-Formular, Profil (Name, E-Mail etc..) und natürlich Passwörter.

Request bedeutet (auch wörtlich übersetzt) einfach nur Anfrage. Es wird ja nach dem Absenden des Formulars eine Anfrage an den Server gestellt.

Auf übermittelte Daten mit PHP zugreifen
Für den Zugriff auf die per GET oder POST übermittelten Daten stehen dir zwei superglobale Arrays zur Verfügung, $_GET  und $_POST . Was dieses „superglobal“ bedeutet, behandeln wir in einem anderen Artikel, aber behalte vielleicht schonmal im Hinterkopf, dass superglobale von überall aus zugreifbar sind. Jedenfalls, diese Arrays bringt PHP von sich aus mit und müssen nicht deklariert werden. Es gibt sie einfach. Wenn keine Daten übermittelt wurden, sind die Arrays leer und enthalten keine Werte.

Fehlermeldungen aktivieren
Es macht Sinn, die Fehlerausgabe zu aktivieren, zumindest wenn man noch an einem Projekt programmiert oder wenn man -wie du- PHP lernen möchte. Damit Fehlermeldungen angezeigt werden, füge folgende 2 Codezeilen die du im letzten Artikel schon kennengelernt hast einfach immer oben direkt in die nächste Zeile nach <?php  hinzu (selbst wenn ich es in den Code-Beispielen nicht immer mit drin hab):

Das sorgt dafür, dass alle Fehlermeldungen immer ausgegeben werden. In einem späteren Artikel wird das Thema Fehlerbehandlung ausführlich behandelt.

Praxisbeispiel GET und POST

Sehen wir uns folgenden Code an. Wir übermittelt erstmal nur ein Feld, einfach damit du den Unterschied von GET und POST kennen lernst. Daher habe ich dort zwei identische Formulare, die einmal mit GET und einmal mit POST übermittelt werden:

Was da passiert:

  • Ganz normale HTML-Grundstruktur (mit Doctype, head und body)
  • 2 Formulare
  • Mit dem method -Attribut wird angegeben, ob die Daten mit GET oder POST übertragen werden.
  • Die Formulare enthalten je ein Text-Eingabefeld sowie einen Submit-Button.

Natürlich benötigen wir noch eine Datei, an die die Daten gesendet werden. Wie oben im action -Attribut definiert ist das die ziel.php. Erstelle also im gleichen Ordner wo auch deine index.php Datei liegt noch eine Datei ziel.php und füge dort folgenden Code ein:

Im Code werden die beiden superglobalen Arrays $_GET und $_POST mittels dem Befehl print_r()  (den du bereits aus vorherigen Artikeln kennst) ausgegeben.

Um das Beispiel zu testen, öffne also nun die index.php in deinem Browser ( http://localhost/index.php oder eben ein anderer Pfad, falls du nach c:\xampp\htdocs noch weitere Unterverzeichnisse zu deiner index.php Datei hast). Du siehst zwei Formulare.

Trage im ersten Formular (POST) irgendeinen beliebigen Text ein und klicke den Submit-Button „Formular absenden“. Du wirst weitergeleitet auf die Datei ziel.php und erhältst folgende Ausgabe (ich habe in das Textfeld „Hallo Welt!“ eingetippt):

Wie erwartet ist das $_GET Array leer, weil das Formular mit der Methode POST abgesendet wurde. Interessant ist natürlich, welche Werte das $_POST Array enthält. Wie du sehen kannst, enthält dieses genau einen Wert, nämlich „Hallo Welt!“. Und du siehst, dass die Werte im $_POST Array assoziativ indiziert sind, also über einen Namen, in diesem Fall ist das „text“. Genau wie bei den Arrays die wir im vorherigen Artikel selbst deklariert haben, können wir auf die einzelnen Elemente des Arrays zugreifen.

Aber schauen wir uns zuerst noch an wie es aussieht, wenn ein Formular mit GET abgesendet wird. Klicke jetzt also den Zurück-Button in deinem Browser um wieder zur index.php zu kommen und fülle das Textfeld des anderen Formulars (das obere) aus, anschließend klicke auch hier wieder auf „Formular absenden“. Du erhältst folgende Ausgabe:

Tja, das hast du dir vermutlich schon gedacht dass es so aussieht. Klar, jetzt ist das $_POST Array leer, weil die Daten mit GET übermittelt wurden.

Und doch ist etwas ganz anders als zuvor mit POST. Schau dir mal die Adressleiste an. Sowas ähnliches müsstest du dort sehen:

localhost/ziel.php?text=Hallo+Welt%21

Interessant oder? Wenn man das Formular mit POST absendet erscheint sowas nicht, bei GET werden die Daten aber über die URL übertragen.

Wie ich oben schon erwähnt hab, gibt es kaum Fälle in denen man Formulare mit GET absendet. Es ist eher der Fall, dass man Seiten über einen Hyperlink direkt mit den Parametern in der URL aufruft. Also quasi sowas wie index.php?sortieren_nach=name  um einfach Parameter zu übergeben um die Darstellung der Seite anzupassen, um Filter zu setzen und sonstiges. Geht auch viel schneller und unkomplizierter als extra ein Formular dafür abzusenden.  Außerdem ist die Anzahl an Zeichen für eine URL begrenzt. Und gerade wenn es um Benutzereingaben geht können wir nicht sicher sein wie lang der Inhalt am Ende wird. Hierfür wird es im nächsten Artikel noch Code-Beispiele geben. Vorerst verabschieden wir uns von der GET-Methode.

Beispiel mit mehreren Feldern

Erweitern wir den Code von oben und fügen weitere Felder hinzu:

Und die ziel.php:

Jetzt wieder die index.php im Browser aufrufen und ein paar Felder ausfüllen, dann absenden.

Auf die Elemente in den $_GET und $_POST Arrays kannst du genauso zugreifen wie auf alle anderen Arrays auch, wie ich es dir im letzten Artikel ja gezeigt hab.

Auswertung und Fehlermeldungen

Wie schon erwähnt erfolgt der Zugriff auf die übermittelten Daten über die $_GET und $_POST Arrays assoziativ. Der Wert ist dabei immer der Wert den man im Feld zugewiesen hat – beim Textfeld also beispielsweise der Text den man eingetippt hat oder das was im value-Attribut eingegeben wurde. Der Array-Schlüssel ist der Inhalt des name-Attributs (beim Textfeld haben wir beim name-Attribut „text“ angegeben, später ist dann der Wert auch im $_GET oder $_POST Array an einem assoziativen Index mit diesem Namen zu finden, also $_GET['text']  bzw. $_POST['text'] ).  Ein bisschen anders verhält es sich bei der Checkbox. Bei der Checkbox ist es so, dass wenn kein Haken gesetzt wurde, später im Array ($_GET oder $_POST) auch kein Element hierfür existiert. Anders als beim Textfeld, denn auch wenn dort nichts eingegeben wurde, gibt es nach dem Absenden hierfür ein Element im Array – der Wert ist halt dann leer. Eine weitere Besonderheit ist, dass wenn du in der Checkbox einen Haken gesetzt hast, der Wert später „on“ ist. Nun, das passiert automatisch, wenn im select-Tag kein value-Attribut gesetzt wurde. Wenn eins gesetzt wurde, kann man dieses Verhalten ändern und einen anderen Wert wählen.

Mit Sicherheit bekommst du nach dem Absenden eines Formulars Fehlermeldungen auf der Seite zu sehen (wenn du wie oben beschrieben immer die zwei Zeilen am Anfang hinzugefügt hast um die Fehlerausgabe zu aktivieren).
Das heißt es taucht bei dir nach Absenden des Formulars ein Fehler auf der so oder so ähnlich aussieht.

Notice: Undefined index: text in /pfad/zur/ziel.php on line 7

Die Meldung steht entweder bei POST wenn das Formular mit GET abgesendet wurde oder bei GET wenn es mit POST abgesendet wurde. Logisch, weil ja eins der beiden Arrays leer sein muss. Schließlich können wir nicht 2 Formulare auf einmal absenden.

Und was mache ich nun mit den übermittelten Daten?

Wir können jetzt schonmal Daten an den Server übermitteln und die übergebenen Daten mit echo anzeigen, ist doch was.

Und ein paar Dinge sind schon möglich. Experimentieren wir ein wenig …

Berechnungen durchführen

Wir basteln ein Formular bestehend aus zwei Textfeldern, in die man jeweils Zahlen eingeben kann. Nach dem Absenden addieren wir beide Zahlen und geben das Erebnis aus:

Und die ziel.php:

Öffne nun wieder die index.php im Browser und trage in beide Textfelder Zahlen ein, danach klicke auf „Ausrechnen“. Du erhältst eine ähnliche Ausgabe wie

Notendurchschnitt ermitteln

Du kennst das noch damals aus der Schule, wenn Exen oder Tests geschrieben wurden, kam danach immer ein Klassendurchschnitt raus. Probieren wir das auch mal. Im folgenden Code-Beispiel nehmen wir an, dass die Klasse insgesamt 8 Schüler hat:

Und in der ziel.php wieder die Auswertung:

Fülle die Felder aus und klicke dann auf „Ausrechnen“. Anschließend werden alle Noten zusammengezählt und durch die Anzahl an Noten (also 8) geteilt, um den Durchschnitt zu erhalten.

Ich weiß‘ nicht wie es dir geht, aber der Code um den Durchschnitt zu berechnen, ist echt hässlich. Wir werden dieses Beispiel zu einem späteren Zeitpunkt nochmal aufgreifen, wenn wir effizientere Lösungen kennengelernt haben.

String-Funktionen

Noch ein letztes Beispiel mit Zeichenketten. Wir haben ein einziges Textfeld und nach dem Absenden formatieren wir die Eingabe entsprechend. Einige String-Funktionen hast du bereits im Artikel mit den Variablen kennengelernt.

In der ziel.php stellen wir mit dem vom Benutzer eingegebenen Text allerhand an:

Sofern du den Text im Textfeld nicht änderst, sieht die Ausgabe nach dem Absenden in etwa so aus:

 

Sicherheit mit Benutzereingaben

Ganz wichtig: traue niemals Benutzereingaben!
Manche Leute gehen extra auf Webseiten und versuchen, Formulare zu manipulieren, indem sie HTML-Code in die Felder eintragen um zu sehen was nach dem Absenden passiert – ich selbst bin so einer. Angenommen man gibt in ein Textfeld  <b>Test</b>  ein, klickt auf Absenden und der eingegebene Text wird als HTML geparst und ausgegeben (sodass dann dort in fetter Schrift Test steht), dann weiß man gleich dass die Daten nicht entsprechend sicher maskiert werden. An dem Punkt kann man dann gut und gern also auch JavaScript-Code einbetten. Teste das selbst mal, indem du das letzte Code-Beispiel her nimmst und ins Textfeld folgenes eingibst:

Test<b onClick="alert('F');">Klick mich</b>

Klicke auf „Absenden“ und du siehst, dass einige Texte fett markiert sind. Und wenn du auf „Klick mich“ klickst, öffnet sich ein JavaScript-Alert. Sowas ist zwar harmlos, aber man könnte ja dort auch ganz anderen, schlimmen Code ausführen. Sowas nennt man eine XSS Attacke (Cross Site Scripting).

Wie sorge ich also für Sicherheit?

Dafür gibt es die Funktion htmlspecialchars(), die einfach dafür sorgt dass in einem übergebenen Text spezielle Sonderzeichen maskiert werden. Die Funktion erwartet 3 Argumente

  1. den Text der konvertiert werden soll
  2. die Art und Weise wie Anführungszeichen behandelt werden und
  3. die Zeichenkodierung.

Jage Benutzereingaben also vor der Ausgabe durch diese Funktion, um deine Webanwendung vor derlei Attacken zu schützen. Ändern wir den Code aus dem letzten Beispiel der ziel.php:

Trage ins Textfeld wieder den „schädlichen“ Code ein:

Sende dann das Formular erneut ab. Du erhältst folgende Ausgabe:

Jetzt erhalten wir eine korrekte Ausgabe. Das ist dann zwar ein bisschen mehr Code zu schreiben wenn man vor der Ausgabe immer htmlspecialchars hinzufügen muss, das sollte dir aber die Sicherheit deiner Webanwendung Wert sein. Selbstverständlich zaubern wir uns später noch etwas, das einfacher und schneller geht.

 

Links & Infos

 

FAQ

Wie kann ich Benutzereingaben abfragen?
Sicher hast du dir schon einige interessante Dinge überlegt, die man mit solchen Formularen anstellen könnte. Was fehlt ist quasi eine Art Unterscheidung. Allein oben haben wir ja mit Code zu tun, der so oder so Fehlermeldungen produziert, weil wir eben auf einen Array-Index zugreifen den es gar nicht gibt. Und hier gehört eigentlich eine Abfrage hin. Das heißt eine Ausgabe erfolgt nur, wenn auch wirklich etwas übermittelt wurde. Und man will bestimmt auch sicher gehen, dass z.B. erforderliche Pflichtfelder übermittelt wurden. Das kann man zwar schon in HTML mit dem required-Attribut machen, allerdings können solche Dinge vom Benutzer manipuliert werden. Serverseitige Abfragen und Überprüfungen kann der Benutzer nie umgehen oder manipulieren.

Was meinst du mit dem „Manipulieren“ von HTML?
Feldattribute können vom Besucher der Seite manipuliert werden. Das ist ganz simpel. Man öffnet einfach im Browser die Entwickler-Tools (öffnet sich meist wenn man einfach die Taste F12 drückt), untersucht den Quellcode und hat sogar die Möglichkeit, diverse Manipulation vorzunehmen, zum Beispiel IDs oder Klassen umbenennen oder Attribute zu ändern. So könnte man z.B. Felder die als Pflichtfeld deklariert sind (mit dem required Attribut) einfach leer lassen und das Formular trotzdem absenden, indem man das required aus dem Code raus löscht. Und wenn dann serverseitig keine Überprüfung erfolgt weil man sich auf die HTML-Validierung verlassen hat, ist man am Arsch. Ich zitiere mich nochmal selbst: traue niemals Benutzereingaben.

Was passiert wenn ich in dem Rechen-Beispiel Text statt Zahlen eingebe?
Sehr gute Frage, das zeigt dass du einen Schritt weiter denkst. Also zuerst mal würde ich sagen probier’s aus. Wahrscheinlich kommt 0 raus. Aber wenn man es genau nimmt, sollte man solche Berechnungen auch nicht durchführen. Schließlich behandeln wir die Eingaben als Zahlen ohne vorher zu prüfen, ob auch wirklich nur gültige Zahlenwerte eingegeben wurden. Und das macht man in der Programmierung grundsätzlich nicht. Aber warum zeige ich es dir dann falsch? Nun, weil wir noch nicht die Möglichkeit haben solche Fälle zu überprüfen, dafür müssten wir wissen wie man Vergleiche macht – und das Thema kommt erst im nächsten Artikel.

Fazit

Formulare kannst du jetzt auch – schön. Im Frontend sind Formulare meist nicht allzu wichtig, auf gewöhnlichen Webseiten findet man sie eigentlich nur in Form eines Login-, Registrierungs- oder Kontaktformulars oder Gästebuchs. Wirklich spannend wird die Funktion von Formularen bei Webanwendungen im Backend, also bei einer Verwaltungsoberfläche für irgendeine Websoftware (z.B. Kunden- und Benutzerverwaltung, Inventursoftware oder ähnliches).

Im nächsten Artikel bringen wir noch mehr Dynamik in unsere Webanwendungen, dort arbeiten wir dann mit Kontrollstrukturen. Super, noch ein kompliziertes Wort. Nein, das heißt nur dass wir prüfen ob eine Bedingung zutrifft, falls ja passiert dies ansonsten tue etwas anderes. Quasi eine einfache Wenn-Dann-Sonst-Abfrage. Zum Beispiel können wir so überprüfen, ob der Haken in der Checkbox gesetzt wurde, und nur falls ja, wird etwas ausgegeben, andernfalls zeige die Meldung „Bitte AGB akzeptieren“ oder so ähnlich. Du verstehst schon was ich meine.

Ist dir bis hierhin soweit alles klar? Wenn irgendwelche Fragen auftauchen, einfach unten einen Kommentar da lassen.

Bis zum nächsten Artikel
Marius

Ein Kommentar

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich stimme zu.