PHP 8.4.1 Released!

Variablen aus externen Quellen

HTML-Formulare (GET and POST)

Sobald ein Formular an ein PHP-Skript übergeben wird, werden die Informationen dieses Formulars dem Skript automatisch zur Verfügung gestellt. Es gibt ein paar Möglichkeiten, auf diese Informationen zuzugreifen, zum Beispiel:

Beispiel #1 Ein einfaches HTML-Formular

<form action="foo.php" method="post">
    Name:  <input type="text" name="username" /><br />
    E-Mail: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Und ab!" />
</form>

Es gibt nur zwei Möglichkeiten, um auf die Daten von HTML-Formularen zuzugreifen. Die zurzeit verfügbaren Methoden werden unten aufgeführt:

Beispiel #2 Zugriff auf die Daten eines einfachen HTML-POST-Formulars

<?php
echo $_POST['username'];
echo
$_REQUEST['username'];
?>

Die Verwendung eines GET-Formulars ist, davon abgesehen, dass stattdessen die entsprechende vordefinierte GET-Variable verwendet werden kann, ähnlich. Außerdem wird GET auch für den QUERY_STRING (die Information nach dem '?' in einer URL) verwendet. So enthält zum Beispiel http://www.example.com/test.php?id=3 GET-Daten, auf die mit $_GET['id'] zugegriffen werden kann. Siehe auch $_REQUEST.

Hinweis:

Punkte und Leerzeichen in Variablennamen werden in Unterstriche umgewandelt. Zum Beispiel wird <input name="a.b" /> zu $_REQUEST["a_b"].

Im Zusammenhang mit Formular-Variablen versteht PHP auch Arrays (siehe auch die zugehörige FAQ). So können z. B. zusammengehörige Variablen gruppiert werden, oder diese Funktionalität kann verwendet werden, um Werte aus einer Eingabe mit Mehrfachauswahl abzurufen. Schicken wir zum Beispiel ein Formular an sich selbst und lassen nach dem Versand die Daten anzeigen:

Beispiel #3 Komplexere Formular-Variablen

<?php
if ($_POST) {
echo
'<pre>';
echo
htmlspecialchars(print_r($_POST, true));
echo
'</pre>';
}
?>
<form action="" method="post">
Name: <input type="text" name="personal[name]" /><br />
E-Mail: <input type="text" name="personal[email]" /><br />
Bier: <br />
<select multiple name="bier[]">
<option value="oettinger">Öttinger</option>
<option value="bitburger">Bitburger</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="Und ab!" />
</form>

Hinweis: Beginnt der Name einer externen Variablen mit einer gültigen Array-Syntax, dann werden darauf folgende Zeichen stillschweigend ignoriert. Zum Beispiel wird <input name="foo[bar]baz"> zu $_REQUEST['foo']['bar'].

IMAGE-SUBMIT-Variablennamen

Zur Übertragung eines Formulars kann auch ein Bild statt eines Übertragungs-Schalters (Submit-Button) verwendet werden, dessen Tag wie folgt aussieht:

<input type="image" src="image.gif" name="sub" />

Klickt der Benutzer irgendwo auf das Bild, wird das entsprechende Formular an den Webserver übertragen. Hierbei sind zwei zusätzliche Variablen vorhanden, sub_x und sub_y. Diese enthalten die Koordinaten des Klickpunktes innerhalb des Bildes. Die Erfahreneren werden bemerken, dass die Variablen, die vom Browser gesendet werden, einen Punkt statt eines Unterstrichs enthalten. Dieser Punkt wird von PHP automatisch in einen Unterstrich verwandelt.

HTTP-Cookies

PHP unterstützt HTTP-Cookies auf völlig transparente Weise, wie in » RFC 6265 definiert. Cookies sind ein Mechanismus zur Speicherung von Daten auf dem Client-Rechner, um damit wiederkehrende Benutzer nachzuverfolgen oder zu identifizieren. Mit der Funktion setcookie() ist es möglich, Cookies zu erzeugen. Cookies sind Teil des HTTP-Headers, deshalb muss die Funktion setcookie() aufgerufen werden, bevor irgendeine Ausgabe an den Browser gesendet wird. Dabei handelt es sich um die gleiche Einschränkung, die auch für die Funktion header() gilt. Cookie-Daten stehen dann in den entsprechenden Cookie-Daten-Arrays, zum Beispiel $_COOKIE, sowie in $_REQUEST zur Verfügung. Weitere Details und Beispiele sind auf der Seite setcookie() des Handbuchs zu finden.

Hinweis: Aus Sicherheitsgründen werden ab PHP 7.2.34, 7.3.23 bzw. 7.4.11 die Namen der eingehenden Cookies nicht mehr URL-dekodiert.

Wenn einer einzelnen Cookie-Variablen mehrere Werte zugewiesen werden sollen, müssen diese als Array zugewiesen werden. Zum Beispiel:

<?php
setcookie
("MeinCookie[foo]", 'Ich teste 1', time()+3600);
setcookie("MeinCookie[bar]", 'Ich teste 2', time()+3600);
?>

Dadurch werden zwei einzelne Cookies erzeugt, obwohl MyCookie im Skript nun ein einziges Array ist. Wenn nur ein Cookie mit mehreren Werten gesetzt werden soll, empfiehlt es sich, zuerst serialize() oder explode() auf das Array anzuwenden.

Es ist zu bedenken, dass ein Cookie ein vorhergehendes Cookie gleichen Namens im Browser überschreibt, es sei denn, der Pfad oder die Domain sind anders. Für eine Warenkorb-Anwendung kann somit z. B. ein Zähler mitgeführt und weitergegeben werden:

Beispiel #4 Ein setcookie()-Beispiel

<?php
if (isset($_COOKIE['zaehler'])) {
$count = $_COOKIE['zaehler'] + 1;
} else {
$count = 1;
}
setcookie('zaehler', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>

Punkte in eingehenden Variablennamen

Normalerweise verändert PHP die Variablennamen nicht, wenn sie einem Skript übergeben werden. Es sollte aber beachtet werden, dass der Punkt (".") kein gültiger Bestandteil eines Variablennamens ist. Deshalb achten Sie auf folgendes:

<?php
$varname
.ext; /* ungültiger Variablenname */
?>
Der PHP-Parser sieht eine Variable namens $varname, gefolgt von einem Zeichenketten-Verbindungsoperator, dieser wiederum gefolgt von der offenen Zeichenkette 'ext' (also nicht eingegrenzt durch '"' und auch keinem Schlüsselwort oder reserviertem Bezeichner entsprechend). Das kann natürlich nicht zum gewünschten Ergebnis führen.

Deshalb ist es wichtig zu wissen, dass PHP in den ihm übergebenen Variablen alle Punkte (.) automatisch durch einen Unterstrich (_) ersetzt.

Bestimmung des Variablen-Typs

Da PHP den Typ der Variablen bestimmt und (im Allgemeinen) selbst eine entsprechende Umformung vornimmt, ist es nicht immer klar, welchen Typ eine Variable gerade hat. PHP beinhaltet einige Funktionen, die dies herausfinden, wie zum Beispiel: gettype(), is_array(), is_float(), is_int(), is_object() und is_string(). Lesen Sie bitte auch das Kapitel über Typen.

Da HTTP ein Text-Protokoll ist, werden die meisten, wenn nicht alle Inhalte von superglobalen Arrays, wie $_POST und $_GET, als Zeichenketten erhalten bleiben. PHP wird nicht versuchen, die Werte in spezifische Typen umzuwandeln. Im Beispiel weiter unten enthält $_GET["var1"] die Zeichenkette "null" und $_GET["var2"] die Zeichenkette "123".

/index.php?var1=null&var2=123

Changelog

Version Beschreibung
7.2.34, 7.3.23, 7.4.11 Aus Sicherheitsgründen werden die Namen der eingehenden Cookies nicht mehr URL-dekodiert.

add a note

User Contributed Notes 2 notes

up
22
Anonymous
16 years ago
The full list of field-name characters that PHP converts to _ (underscore) is the following (not just dot):
chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)

PHP irreversibly modifies field names containing these characters in an attempt to maintain compatibility with the deprecated register_globals feature.
up
4
krydprz at iit dot edu
19 years ago
This post is with regards to handling forms that have more than one submit button.

Suppose we have an HTML form with a submit button specified like this:

<input type="submit" value="Delete" name="action_button">

Normally the 'value' attribute of the HTML 'input' tag (in this case "Delete") that creates the submit button can be accessed in PHP after post like this:

<?php
$_POST
['action_button'];
?>

We of course use the 'name' of the button as an index into the $_POST array.

This works fine, except when we want to pass more information with the click of this particular button.

Imagine a scenario where you're dealing with user management in some administrative interface. You are presented with a list of user names queried from a database and wish to add a "Delete" and "Modify" button next to each of the names in the list. Naturally the 'value' of our buttons in the HTML form that we want to display will be "Delete" and "Modify" since that's what we want to appear on the buttons' faceplates.

Both buttons (Modify and Delete) will be named "action_button" since that's what we want to index the $_POST array with. In other words, the 'name' of the buttons along cannot carry any uniquely identifying information if we want to process them systematically after submit. Since these buttons will exist for every user in the list, we need some further way to distinguish them, so that we know for which user one of the buttons has been pressed.

Using arrays is the way to go. Assuming that we know the unique numerical identifier of each user, such as their primary key from the database, and we DON'T wish to protect that number from the public, we can make the 'action_button' into an array and use the user's unique numerical identifier as a key in this array.

Our HTML code to display the buttons will become:

<input type="submit" value="Delete" name="action_button[0000000002]">
<input type="submit" value="Modify" name="action_button[0000000002]">

The 0000000002 is of course the unique numerical identifier for this particular user.

Then when we handle this form in PHP we need to do the following to extract both the 'value' of the button ("Delete" or "Modify") and the unique numerical identifier of the user we wish to affect (0000000002 in this case). The following will print either "Modify" or "Delete", as well as the unique number of the user:

<?php
$submitted_array
= array_keys($_POST['action_button']);
echo (
$_POST['action_button'][$submitted_array[0]] . " " . $submitted_array[0]);
?>

$submitted_array[0] carries the 0000000002.
When we index that into the $_POST['action_button'], like we did above, we will extract the string that was used as 'value' in the HTML code 'input' tag that created this button.

If we wish to protect the unique numerical identifier, we must use some other uniquely identifying attribute of each user. Possibly that attribute should be encrypted when output into the form for greater security.

Enjoy!
To Top