Formular

Formular senden und empfangen

Beispiel

Ein Formular kann aus vielen Eingabe- und Auswahlmöglichkeiten bestehen. Siehe dazu HTML Formular.

Die eingegebenen oder ausgewählten Formulardaten können an ein PHP Programm/ PHP Seite verschickt werden.

Dort werden Sie empfangen und weiter verarbeitet. Die Verarbeitung kann darin bestehen, die Daten in eine Datenbank einzutragen, per Email zu versenden oder auch einfach nur auf der Seite anzuzeigen, wie im folgendem Beispiel.

Die Attribute des Form Elements siehe meinen Tipp

Im Attribut action wird hier ein Verweis auf das PHP Programm gesetzt, formular.php. Betätigt der User den Submit Button werden die Daten verschickt.

Das Attribut method bestimmt die Art der Übertragung: post oder get. Die Daten werden auf der PHP Seite mit der zuvor gesetzten Methode empfangen. $_POST["vorname"]

In PHP gibt es einige vordefinierten Klassen, unter anderem $_POST und $_GET. Das sind assosiative Arrays. Werden Variablen mit POST verschickt, werden diese automatisch Elemente von $_POST , welche man über die eckigen Klammern in Hochkommata ansprechen kann $_POST["nachname"]. Werden die Daten mit der Methode GET verschickt, werden Sie zu Elementen des assosiativen Arrays $_GET und können auf gleiche Weise angesprochen werden. $_GET["vorname"].
Alternativ kann man $_REQUEST nutzen, welche für beide Methoden gilt.

Damit kein böswilliger Code in die Programmierung gelangt, sollten alle HTML-spezifischen Zeichen mit htmlentities() in die entsprechenden Entities umgewandelt werden.

Im folgenden sehen wir eine Datei formularSenden.html mit einem Formular, welche die Eingaben an eine Datei formularEmpfang.php verschickt.

formular.html

<form action="formular.php" method="post">
<p>
<label>Vorname<br>
<input type="text" name="vorname">
</label>
</p>
<p>
<label>Nachname<br>
<input type="text" name="nachname">
</label>
</p>
<p><input type="submit"></p>
</form>

formular.php

<?php
$vorname = htmlentities($_POST["vorname"]);
$nachname = htmlentities($_POST["nachname"]);
echo $vorname." ".$nachname;
?>

POST & GET

Es gibt 2 Arten wie die Daten verschickt werden, post und get. Die mit get verschickten Daten werden an die URL angehängt, man sieht sie in der Adresszeile des Browsers
empfang.html?vorname=Michael&nachname=Albers

Die mit post versandten Daten werden im Dokumentkörper übertragen, man sieht sie im Devolper Modus des Browsers unter Netzwerkanalyse / Nutzlast (google chrome). Die Datenmenge ist bei post nicht begrenzt.

Die Standardübertragung ist GET, das sieht man, wenn man diese mit PHP ermittelt und ausgibt. Mittels $_SERVER[REQUEST_METHOD] wird die Übertragungsart angezeigt.
Da get die Standardübertragung ist, hat man die Möglichkeit die Variablen mit Werten direkt an die URL in einem Link anzuhängen:

<a href="anzeige.php?name=Michael&nachname=Albers">meine daten</a>

Die Methode GET lässt sich sehr gut für Suchen verwenden, da man so auch das Suchergebnis, als URL versenden kann. Wer hat nicht schon mal das Suchergebnis von Google per Whats App verschickt. Desweiteren werden diese Seiten auch im Browserverlauf gespeichert.

Mittels print_r($_GET) werden alle Daten, des globalen Arrays $_GET angezeigt. Probiere auch $_POST und $_REQUEST für beides.

POST & GET
POST GET
Übertragung im Dokumentkörper Übertragung per URL
nicht direkt sichtbar URL in Browserverlauf gespeichert
Datenmenge unbegrenzt Datenmenge begrenzt
manipulierbar in den Entwicklertools direkt manipulierbar
Konatkformulare, Datenbanken Suchanfragen, Blätterfunktionen
$_POST $_GET
$_REQUEST

Mit POST verschickte Formulardaten in den Entwicklertools anzeigen

Die mit GET verschickten Daten sieht man oben in der Adresszeile des Browsers. Die mit POST verschickten Daten kann man sich mit den Entwicklertools anzeigen lassen. Drücke dazu die Taste F12 sowohl im Firefox als auch in Google Chrome.

Sollte man in Chrome den Dateinamen nicht sehen, drücke Strg R

Google Chrome Entwicklertools
Chrome Entwicklertools
Firefox Entwicklertools
Firefox Entwicklertools

 

 

Formular in gleicher Datei auswerten

Beispiel

Wenn man ein Formular nicht an eine weitere Php-Datei schicken möchte, sondern die Daten des Formulars in der gleichen Datei auswerten möchte, muss man im PHP Code überprüfen ob die gesendeten Variablen vorhanden sind und ob in einem oder mehreren Eingabefeldern eine Eingabe gemacht wurde. Das action Atrribut im form Element verweist auf die eigene Seite, so dass diese nochmals geladen wird, wenn man den submit Button anklickt.

<input type="submit" name="gesendet">

Gibt man dem Submit Button ein name Attribut, kann man mit isset()überprüfen, ob diese Varible existiert und das tut sie nur, wenn der User den Button angeklickt hat.

    if (isset($_POST["gesendet"])) {
        $vorname = htmlentities($_POST["vorname"]);
        $nachname = htmlentities($_POST["nachname"]);
        echo "Hallo mein lieber $vorname $nachname";
    }

Mit else könnte man noch auf die verschiedenen Situationen reagieren und entsprechende Ausgaben machen, wie im Beispiel.

Eingaben nach Absenden angezeigt lassen

Wenn man ein Formular in gleicher Datei auswertet, werden nach dem Abschicken des Formulars die eingetragenen Werte in den Eingabefeldern gelöscht, da die Seite neu geladen wurde. Das kann man verhindern.

Man fragt mit dem Null Coalescing Operator ab, ob die Formualfelder empfangen wurden und weist die Werte einer Variablen zu, andernfalls wird der Variablen ein leerer String zugewiesen.

$vorname = htmlspecialchars($_GET["vorname"] ?? "");

 

Diese Variable weist man dem value Attribut des entsprechenden Eingabefeldes zu.

Die Zuweisung kann mit der echo Kurzschreibweise erfolgen:

<?= $vorname ?>

<input type="text" name="vorname" value="<?= $vorname ?>">

 

Mehrere Werte eine Variable / Checkbox, Select

Man kann bei Select Feldern mit der Option multiple mehrere Auswahlen erwmöglichen. Damit die Auswahlen in einem Array verarbeitet werden können, gibt man dem name Attribut einen Namen mit [] eckigen Klammern:
name="artist[]" so wird daraus ein Array.
Auch Checkboxen können alle mit dem gleichen, auf diese Art notiertem Namen mit eckigen Klammern versehen werden.

Da man ein Array empfängt, kann man dieses auch mit allen Arrayfunktionen verarbeiten oder auslesen, beispielsweise mit einer foreach() Schleife.

Es folgt ein Beispiel einer Select-Auswahlliste und der Verarbeitung in PHP auf gleicher Seite.

HTML

  <form action="#" method="post">
  
  <select multiple="multiple" name="artist[]">
        <option checked="checked" value="Peter Gabriel"> Peter Gabriel</option>
        <option value="Peter Alexander"> Peter Alexander</option>
        <option value="Peter Maffay"> Peter Maffay</option>
        <option value="Peter Frampton"> Peter Peter Frampton</option>
        <option value="Peter Fox"> Peter Fox</option>
</select>

<p><input type="submit" name="gesendet"> <input type="reset"></p>
</form>

 

PHP

   if (isset($_POST["artist"])) {
      echo "Es spielt für Sie: ";
      $artist = $_POST["artist"];
      for ($i = 0; $i < count($artist); $i++)
         echo  $artist[$i] . ", ";
   } 

Mit einer foreach() Schleife sähe das folgendermaßen aus.

   if (isset($_POST["artist"])) {
      echo "Es spielt für Sie: ";
      $artist = $_POST["artist"];
      foreach ($artist as $art); $i++)
         echo htmlspecialchars($art) . "<br>\n";
   }

Sicherheit XSS

Unter XSS oder Cross Site Scripting versteht man Hacktechniken, mit denen schädlicher Code in Formularen eingefügt wird. Wie schon erwähnt sollten HTML- Zeichen maskiert werden htmlspecialchars, denn sonst wäre es möglich, dass man HTML-Code oder Javascript Code über ein Formularfeld in die Seite einschleust.

Es ist außerdem möglich, dass man in den Developertools des Browsers (F12) die Werte von Radiobuttons, Checkboxen, Selectfeldern ändert oder Felder hinzufügt. Wenn das Formularfeld dann verschickt wird, werden diese manipulierten oder hinzugefügten Werte verschickt. Also sollten auch die Werte aus diesen Feldern mit htmlspecialchars bei der Verarbeitung maskiert werden.

Hinzufügen von Feldern verhindern

Wenn jedoch über die Developertools ein Feld hinzugefügt wird reicht das nicht mehr aus. Ich zeige am folgenden Beispiel wie man in einer Select Liste verhindert, dass ein Feld hinzugefügt werden kann.

Vor dem Formular wird in PHP ein Array themen erstellt, welches die value Werte der option Elemente in der select List enthält:

    $themen = ["HTML", "CSS", "Javascript", "PHP"];

Dann wird das Formular in HTML-Markup erstellt darin der Anfangstag der Select Liste mit den erforderlichen Attributen:

<select name="thema">

Die einzelnen Option Felder werden per PHP mit den Werten des Array "themen" erstellt.

 foreach ($themen as $el) {
                    echo "<option value='$el'>$el</option>\n";
                }

Wie man am Beispiel sieht wird der value Wert und die Anzeige aus dem Array entnommen.

Das schließende select Tag und der Rest des Formulars inklusive submit-Button, kann dann wieder im HTML Markup folgen.

Geben wir dem submit Button ein Attribut name="gesendet".

Zur Auswertung des Formulars wird überprüft ob das Formular versandt wurde:

if(isset($_POST["gesendet"])

In dieser if Struktur wird in einer weiteren if Struktur überprüft ob der gesendete Select-Wert einem Wert aus dem themen Array entspricht. Die Array Funktion in_array() überprüft das.

 if (isset($_POST["thema"]) && (in_array($_POST["thema"], $themen))) {
            echo "Dein gewähltes Thema ist: " . $_POST["thema"];
        }

Datenfilter Emailadressen überprüfen

Mit dem vorinstallierten Datenfiltererweiterung von PHP lassen sich verschiedene Werte überprüfen und filtern. Es gibt 2 verschiedene Filtertypen, einen zur Validierung und einen zur Säuberrung.

Filterfunktionen

Email Adressen überprüfen
filter_var($email,FILTER_VALIDATE_EMAIL)

siehe auch Emails mit PHP verschicken

Wenn man PHP Emails verschickt, sollte überprüft werden, ob es sich um eine gültige Email Adresse handelt. Das wäre mit String Methoden und Regulären Ausdrücken möglich, aber dann müsste man sich intensiv mit dem Aufbau von Email Adressen beschäftigen. Einfacher ist es, die vorinstallierte Datenfiltererweiterung von PHP zu nutzen.

Darin gibt es die Funktion filter_var($email, FLTER_VALIDATE_EMAIL) mit dem hier aufgeführten zweiten Parameter. Sie liefert true, wenn es sich um eine gültige Email Adresse handelt.

$email = "ich@meineDomain.de";
if(filter_var($email, FILTER_VALIDATE_EMAIL)=== false){
    echo "Die Emailadresse ist nicht gültig.";
}else{
    echo "Emailadresse ist gültig";
}

Email Adressen säubern
filter_var($email,FILTER_SANITIZE)

Man kann falsch eingegeben Email Adressen säubern.
Es lassen sich falsch eingegebene Leerzeichen oder Klammern entfernen.

$a = "(rick - morty @ example . org)";
$sanitized = filter_var($a, FILTER_SANITIZE_EMAIL);
echo $sanitized;

rick-morty@example.org

Implizites Umwandeln der Formulardaten in numerische Werte

Eigentlich werden vom Formular nur Strings übertragen, aber man braucht oft numerische Werte, um mit ihnen rechnen zu können.

Wenn die Eingaben bestimmte Kriterien erfüllen werden sie automatisch zu Zahlenwerten umgewandelt.

Folgende Eingaben werden implizit in Zahlen umgewandelt.

12 Integer
1.23 Float
+12 positive Zahl mit Vorzeichen
-12 negative Zahl mit Vorzeichen
1e2 Exponent
1E2 Exponent
1e-2 Exponent
1E-2 Exponent

 

Stehen andere Werte hinter der Zahl wird nur der numerische Wert bis zu den anderen Zeichen genommen. Es erfolgt eine Warnung.

12xy ergibt 12 mit Warnung

 

Beispiel

HTML

<form action="04_umwandeln.php" method="post">
<p><label><input type="text" name="val1" value="23"> value 1</label></p>
<p><label><input type="text" name="val2" value="-23"> value 2</label></p>
<p><label><input type="text" name="val3" value="1.49"> value 3</label></p>
<p><label><input type="text" name="val4" value="4e3"> value 4</label></p>
<p><input type="submit"></p>
</form>

PHP

$val1 = htmlentities($_POST["val1"]);
$val2 = htmlentities($_POST["val2"]);
$val3 = htmlentities($_POST["val3"]);
$val4 = htmlentities($_POST["val4"]);
echo "$val1 + $val2 +$val3 + $val4 <br>";
$ergebnis = $val1 + $val2 +$val3 + $val4 ;
echo $ergebnis;

Umwandeln in Number oder String intval() / floatval() strval()

Da man sich nie sicher sein kann, was der User eingibt, sollte man die Zahlendaten umwandeln in numerische Werte. Das macht den Code auch sicherer und eine Umwandlung mit htmlentities() ist nicht erforderlich.

intval() wandelt in ganze Zahlen um. Alles hinter dem Komma wird abgeschnitten.

floatval() wandelt in Fließkommazahlen um. Hier kann auch der Alias doubleval() genutzt werden.

$x = "2349.43";
$y = floatval($x);

Möchte man etwas in einen String umwandlen wählt man strval(); Das kann erforderlich sein, wenn man die Daten in einer Funktion nutzt, die einen String erwartet.

$a = "Hallo";
$b = strval($a);

Webdesign / PHP / mySQL / Dreamweaver MX Tipps
Copyright © Michael Albers
www.pastorpixel.de