Fortsetzung
Wer den
1. Teil von Formulare verarbeiten mit PHP/MySQL aufmerksam gelesen hat, ist nun gerüstet für den 2. Teil des Tutorials. Im ersten Teil wurde nur gezeigt welche Basis Formular-Elemente es gibt und wie man diese mit PHP abfragen kann. Praktisch einsetzen kann man das Erlernte aber nur bedingt, denn einige wichtige Feinheiten wurden noch nicht besprochen, was wir aber in diesem 2. Teil nachholen werden.
Voraussetzung für Teil 2
Da in diesem Teil nichts in eine Datenbank geschrieben oder ausgelesen wird, begnügen wir uns damit die übermittelten Daten nur auf dem Monitor auszugeben. Eine sehr wichtige Funktion, nicht nur im Umgang mit Formularen, sondern Arrays im Allgemeinen, ist
print_r
Folgenden Schnipsel wird man sehr, sehr oft in seinen Script brauchen können und auch wir werden uns damit anschauen was von einem Formular übermittelt wurde.
PHP-Code:
if (isset( $_POST['submitbutton'] ))
{
echo "<pre>" .print_r( $_POST, true ). "</pre>";
}
Die Funktionsweise kennen wir bereits aus Teil 1. Mit
isset prüfen wir ob das Formular abgeschickt wurde und falls ja, wird alles ordentlich mit print_r auf dem Monitor ausgegeben.
Dann legen wir mal los ...
Wo sind meine Daten?
In den meisten Fällen sehen Formulare so aus wie wir sie in Teil 1 kennengelernt haben. Man hat, am Beispiel eines Kontaktformulars, 2 oder 3 Textfelder für Vorname, Nachname, Betreff und eine Textarea für die Nachricht. Jedes dieser Felder hat einen eindeutigen Namen (definiert im HTML als name="Feldname"), den wir im $_POST Array abfragen können. Manchmal ist es aber nötig, daß wir mehrere Werte abfragen müssen die sich sehr ähnlich sind und die wir in Gruppen zusammenfassen könnten. HTML kennt dafür z.B. ein Select-Feld mit Mehrfachauswahl, daß so aussieht ...
PHP-Code:
<?php
if (isset( $_POST['submitbutton'] ))
{
echo "<pre>" .print_r( $_POST, true ). "</pre>";
}
?>
<html>
<head>
<title>Formular-Elemente</title>
</head>
<body>
<hr />
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Kenntnisse: <select name="kenntnisse" size="6" multiple="multiple">
<option>PHP</option>
<option>MySQL</option>
<option>Javascript</option>
<option>HTML</option>
<option>ASP</option>
<option>C++</option>
</select><br />
<input type="submit" name="submitbutton" id="submitbutton" value="Senden" />
</form>
</body>
</html>
Halten wir die Steuerung-Taste (STRG) gedrückt können wir mehrere Werte auswählen, die dann an unser PHP übermittelt werden. Probieren wir das doch einfach mal. Ich halte also STRG gedrückt und wähle die Einträge PHP, MySQL und HTML aus, klicke dann auf den Senden-Knopf und siehe da ...
Code:
Array
(
[kenntnisse] => HTML
[submitbutton] => Senden
)
... oops, mein Array ist da und HTML, das ich ja auch ausgewählt hatte, ist auch da, aber wo ist der Rest (PHP, MySQL)?
Um zu verstehen wo die Daten abhanden kommen muß man verstehen was beim absenden des Formulars passiert. Wie wir ja wissen wird aus
name="kenntnisse" in HTML ein
$_POST['kenntnisse'] in PHP und in diesem Schlüssel steckt der übermittelte Wert. Bei einem Textfeld in dem nur ein einziger Wert steckt ist das nicht weiter kompliziert, aber bei unserer Mehrfachauswahl kommt folgendes bei PHP an:
PHP-Code:
$_POST['kenntnisse'] = "PHP";
$_POST['kenntnisse'] = "MySQL";
$_POST['kenntnisse'] = "HTML";
Was passiert hier? Richtig! Der Schlüssel "kenntnisse" bekommt nacheinander einen neuen Wert zugewiesen - die Variable wird also mit jedem übermittelten Wert überschrieben und der vorherige Inhalt geht dabei verloren!
Wie wir uns in so einer Situation behelfen können sollte auch bekannt sein, mit einem Array. Naja toll, PHP kennt Arrays aber für HTML ist das etwas unbekanntes, also wie bekommen wir das hin? Dafür gibt es einen simplen "Trick", wie wir PHP mitteilen können das von einem Formular Daten in Form eines Array geliefert werden und das funktioniert in Formularen genauso wie bei PHP - mit eckigen Klammern!
Wenn wir uns die letzte Mehrfachzuweisung noch einmal anschauen und leicht abändern, können wir alle Zuweisungen erhalten.
PHP-Code:
$_POST['kenntnisse'][] = "PHP";
$_POST['kenntnisse'][] = "MySQL";
$_POST['kenntnisse'][] = "HTML";
Wir haben aus der Variable
$_POST['kenntnisse'] ein Array gemacht, daß nun die Schlüssel 0, 1 und 2 enthält, in denen PHP, MySQL und HTML steht. Das brauchen wir nicht manuell zu machen, statt dessen machen wir im HTML-Teil aus
Code:
<select name="kenntnisse" size="6" multiple="multiple">
einfach
Code:
<select name="kenntnisse[]" size="6" multiple="multiple">
und PHP weiß, daß die ankommenden Daten ein Array sind und erzeugt für jeden Wert einen Schlüssel. Prüfen wir das mal nach ...
PHP-Code:
<?php
if (isset( $_POST['submitbutton'] ))
{
echo "<pre>" .print_r( $_POST, true ). "</pre>";
}
?>
<html>
<head>
<title>Formular-Elemente</title>
</head>
<body>
<hr />
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Kenntnisse: <select name="kenntnisse[]" size="6" multiple="multiple">
<option>PHP</option>
<option>MySQL</option>
<option>Javascript</option>
<option>HTML</option>
<option>ASP</option>
<option>C++</option>
</select><br />
<input type="submit" name="submitbutton" id="submitbutton" value="Senden" />
</form>
</body>
</html>
STRG gedrückt halten, PHP, MySQL und HTML auswählen, Senden klicken und siehe da ...
Code:
Array
(
[kenntnisse] => Array
(
[0] => PHP
[1] => MySQL
[2] => HTML
)
[submitbutton] => Senden
)
Exzellent, es hat funktioniert! In PHP können wir z.B. mit
echo $_POST['kenntnisse'][1] MySQL ausgeben lassen.
Werte als Array an PHP übergeben
Dieses verwandeln in ein Array funktioniert auch mit anderen Formular-Elemente, z.B. mit Checkboxen.
Ohne Array müssten wir sehr umständlich eine Liste mit Lieblingsfarben eines Benutzers erzeugen, indem wir jeder Checkbox einen eigenen Namen zuweisen und dann in PHP jeden einzelnen Namen prüfen ob dieser gesetzt wurde. (Checkbox angeklickt wurde)
PHP-Code:
<?php
if (isset( $_POST['submitbutton'] ))
{
echo "<pre>" .print_r( $_POST, true ). "</pre>";
}
?>
<html>
<head>
<title>Formular-Elemente</title>
</head>
<body>
<hr />
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Lieblingsfarbe:<br />
<input type="checkbox" name="farbe_rot" />Rot<br />
<input type="checkbox" name="farbe_blau" />Blau<br />
<input type="checkbox" name="farbe_gruen" />Grün<br />
<input type="checkbox" name="farbe_lila" />Lila<br />
<input type="submit" name="submitbutton" id="submitbutton" value="Senden" />
</form>
</body>
</html>
Klicken wir mal alle 4 Farben an und senden das Formular ab sehen wir folgendes ...
Code:
Array
(
[farbe_rot] => on
[farbe_blau] => on
[farbe_gruen] => on
[farbe_lila] => on
[submitbutton] => Senden
)
Bis wir so die Farben in der DB haben liegt noch etwas Schreibarbeit vor uns. Alle Farben prüfen ob diese angeklickt wurden (
isset()), das "on" durch den Farbname ersetzen, usw.
Das kann man viel einfacher und eleganter machen, indem man mit einem Array und dem value-Attribut in HTML arbeitet.
PHP-Code:
<?php
if (isset( $_POST['submitbutton'] ))
{
echo "<pre>" .print_r( $_POST, true ). "</pre>";
}
?>
<html>
<head>
<title>Formular-Elemente</title>
</head>
<body>
<hr />
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Lieblingsfarbe:<br />
<input type="checkbox" name="lieblingsfarbe[]" value="rot" />Rot<br />
<input type="checkbox" name="lieblingsfarbe[]" value="blau" />Blau<br />
<input type="checkbox" name="lieblingsfarbe[]" value="gruen" />Grün<br />
<input type="checkbox" name="lieblingsfarbe[]" value="lila" />Lila<br />
<input type="submit" name="submitbutton" id="submitbutton" value="Senden" />
</form>
</body>
</html>
Kleine Änderung, große Wirkung. Die Ausgabe sieht nun wie folgt aus:
Code:
Array
(
[lieblingsfarbe] => Array
(
[0] => rot
[1] => blau
[2] => gruen
[3] => lila
)
[submitbutton] => Senden
)
Auf die Art stehen uns sofort die Farben zur Verfügung. Wir müssen nicht jede einzelne Farb-Variable auf Existenz prüfen, sondern können mit
count feststellen wie viele Elemente im Array sind (so viele Lieblingsfarben wurden angeklickt) und können dann ganz bequem per Schleife die Farben ausgeben lassen. Zum Beispiel:
PHP-Code:
<?php
if (isset( $_POST['submitbutton'] ))
{
for ($loop = 0; $loop < count( $_POST['lieblingsfarbe'] ); $loop++)
{
echo $_POST['lieblingsfarbe'][$loop] ."<br>";
}
}
?>
<html>
<head>
<title>Formular-Elemente</title>
</head>
<body>
<hr />
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Lieblingsfarbe:<br />
<input type="checkbox" name="lieblingsfarbe[]" value="rot" />Rot<br />
<input type="checkbox" name="lieblingsfarbe[]" value="blau" />Blau<br />
<input type="checkbox" name="lieblingsfarbe[]" value="gruen" />Grün<br />
<input type="checkbox" name="lieblingsfarbe[]" value="lila" />Lila<br />
<input type="submit" name="submitbutton" id="submitbutton" value="Senden" />
</form>
</body>
</html>
Einfach wenn man weiß wie es geht, nicht wahr?!

Am besten man experimentiert ein wenig mit Formularen herum um sich damit vertraut zu machen und zu verstehen wann was passiert.
Besonderheiten von Textarea und Co.
Textareas und mehrzeilige Textfelder haben noch eine Besonderheit die einen in den Wahnsinn treiben kann, wenn man nicht weiß woran es liegt. Die Rede ist von Zeilenumbrüche in diesen Feldern.
Nehmen wir mal als Beispiel diesen Lorem Text.
Code:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer leo sapien, ultricies et, eleifend feugiat, dictum eget, sem.
In hac habitasse platea dictumst. Donec pretium. Integer pellentesque. Mauris et justo eget odio consectetuer consequat. Vestibulum venenatis diam in libero ullamcorper volutpat.
Integer imperdiet mauris consectetuer velit. Maecenas libero tellus, volutpat vel, vestibulum in, congue eu, dolor.
Integer eget dolor. Etiam gravida mattis eros. Fusce at ante. Morbi faucibus facilisis diam.
Basteln wir uns dazu ein Formular ...
PHP-Code:
<?php
if (isset( $_POST['submitbutton'] ))
{
echo $_POST['zeilenumbruch'];
}
?>
<html>
<head>
<title>Formular-Elemente</title>
</head>
<body>
<hr />
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Lieblingsfarbe:<br />
<textarea name="zeilenumbruch" cols="25" rows="4"></textarea><br />
<input type="submit" name="submitbutton" id="submitbutton" value="Senden" />
</form>
</body>
</html>
Wenn wir nun im Browser den Beispieltext in die Textarea einfügen und das Formular absenden, bekommen wir mit
echo den Inhalt der Textarea angezeigt. Dabei bemerken wir aber etwas seltsames - es sind keine Zeilenumbrüche vorhanden! Der gesamte Text steht in einer einzigen lange Zeile.
Schauen wir uns mal den HTML Quelltext im Browser an dann sehen wir aber, daß die Umbrüche sehr wohl da sind, nur werden sie scheinbar nicht richtig als HTML interpretiert. Das liegt daran das Zeilenumbrüche mit dem unsichtbaren Steuerungszeichen \n (new line) erzeugt werden. Um aber Umbrüche auf einer Webseite anzuzeigen benötigen wir ein HTML konformes <br>. Genau dafür stellt uns PHP eine eigene Funktion zur Verfügung, die sich
nl2br nennt. Sieht kryptisch aus, ist aber sehr einfach zu merken:
new
line
to break - wobei das to mit 2 dargestellt wird. (Zwei auf englisch = two gesprochen tu)
Ergänzen wir also die echo-Zeile um die neue Funktion, dann paßt auch die Ausgabe wieder:
PHP-Code:
echo nl2br( $_POST['zeilenumbruch'] );
Abschließende Worte
Wer sich tapfer durch die beiden Tutorial Teile gelesen hat sollte jetzt in der Lage sein ohne größere Probleme Formulare mit PHP zu verarbeiten. Es ist sehr wichtig dieses Thema zu verinnerlichen und aus dem f.f. zu beherrschen, weil es kaum eine PHP Anwendung gibt in der nicht wenigstens ein Formular vorkommt. Eine Link-Übersicht spare ich mir hier, weil alle wichtigen Funktionen bereits in Teil 1 verlinkt wurden und hier nur einige wenige Funktionen dazu kamen, die direkt im Text zur Dokumentation verlinkt sind.