phpBuddy

Code-Schnipsel

Jeder Programmierer sammelt im Laufe der Jahre Dutzende nützliche Funktionen, Klassen und sonstige Snipets. Hier gibt es einige nützliche Goodies, die jeder frei in seine eigenen Projekte einbauen kann.
Reinschauen lohnt sich!

Sie sind hier: Startseite Formulare verarbeiten (Array Funktionen)
Formulare und PHP - Teil 2 (Array Funktionen)
Beitragsseiten
Formulare und PHP - Teil 2 (Array Funktionen)
Werte als Array übergeben
Besonderheiten von Textareas
Alle Seiten

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 Scripts brauchen können und auch wir werden uns damit anschauen was von einem Formular übermittelt wurde.

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
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 ...

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:

$_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.

$_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

<select name="kenntnisse" size="6" multiple="multiple">

einfach

<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
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 ...

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.