PHP und HTML

PHP und HTML interagieren stark: PHP kann HTML generieren und HTML kann Informationen an PHP weitergeben. Bevor Sie diese FAQ lesen, sollten Sie verstanden haben, wie Sie auf Variablen aus externen Quellen zugreifen können. Die Manual-Seite zu diesem Thema enthält viele Beispiele, die das Verständnis erleichtern.

Wie muss ich kodieren/dekodieren, wenn ich einen Wert über ein Formular/einen URL weitergeben möchte?

Es gibt mehrere Stufen, für die Encoding wichtig ist. Angenommen, Sie haben einen String $data, der den String, den Sie in nicht-kodierter Weise weitergeben möchten, enthält. Dann sind dies die relevanten Stufen:

  • HTML-Interpretation: Wenn Sie einen zufälligen String angeben wollen, müssen Sie ihn in die doppelte Anführungszeichen einschließen und htmlspecialchars() auf den gesamten Wert anwenden.

  • URL: Ein URL besteht aus mehreren Teilen. Wenn Sie wollen, dass Ihre Daten als ein Element interpretiert werden, dann müssen Sie Ihre Daten mit urlencode() kodieren.

Beispiel #1 Ein verstecktes HTML-Formularelement

<?php
echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>

Hinweis: Es wäre falsch, urlencode() auf $data anzuwenden, da es die Aufgabe des Browsers ist, die Daten zu kodieren. Alle populären Browser machen dies auch korrekt. Beachten Sie, dass dies unabhängig von der verwendeten Methode (also z.B. GET oder POST) geschieht. Feststellen werden Sie dies aber nur bei GET-Anfragen, da POST-Anfragen meist versteckt geschehen.

Beispiel #2 Daten, die vom Benutzer bearbeitet werden sollen

<?php
echo "<textarea name='mydata'>\n";
echo
htmlspecialchars($data)."\n";
echo
"</textarea>";
?>

Hinweis: Die Daten werden wie Browser wie gewünscht ausgegeben, da der Browser die HTML-escapten Symbole interpretiert. Nach dem Abschicken, egal ob via GET oder POST, werden die Daten für den Transfer kodiert (mit urlencode()) und von PHP direkt wieder dekodiert (mit urldecode()). Sie müssen also für die Kodierung und Dekodierung nicht selbst sorgen, die Browser und PHP erledigen dies automatisch für Sie.

Beispiel #3 In einem URL

<?php
echo '<a href="' . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . '">'."\n";
?>

Hinweis: Hier wird eine HTML-GET-Anfrage gefakt, deswegen müssen Sie die Daten manuell mit urlencode() kodieren.

Hinweis: Sie müssen htmlspecialchars() auf den gesamten URL anwenden, da der URL als Wert eines HTML-Attributs auftritt. In diesem Fall wird der Browser zuerst etwas wie "un-htmlspecialchars()" auf den Wert anwenden und dann erst den URL weitergeben. PHP wird den URL korrekt verstehen, da Sie die Daten mit urlencode() kodiert haben. Sie werden feststellen, dass das & im URL durch &amp; ersetzt wird. Auch wenn die meisten Browser richtig arbeiten, falls Sie diese Ersetzung vergessen sollten, sollten Sie sich trotzdem nicht darauf verlassen. Das bedeutet, dass Sie - auch wenn Ihr URL nicht dynamisch ist - trotzdem htmlspecialchars() auf den URL anwenden müssen.

Ich versuche ein <input type="image">-Tag zu benutzen, aber die Variablen $foo.x and $foo.y sind nicht verfügbar. Auch $_GET['foo.x'] existiert nicht. Wo finde ich diese?

Wenn ein Formular abgeschickt werden soll, ist es möglich, ein Bild statt des Standard-Submit-Buttons zu verwenden, indem Sie ein Tag wie das folgende verwenden:

<input type="image" src="image.gif" name="foo" />
Wenn der Benutzer irgendwo auf das Bild klickt, wird das zugehörige Formular zusammen mit zwei zusätzlichen Variablen übertragen: foo.x und foo.y.

Da foo.x und foo.y in PHP ungültige Variablennamen erzeugen würden, werden Sie automatisch in $foo_x und $foo_y konvertiert. Die Punkte werden also durch Unterstriche ersetzt. Sie können auf diese Variablen also genauso wie im Abschnitt Variablen aus externen Quellen zugreifen, z.B. $_GET['foo_x'].

Hinweis:

Leerzeichen in Namen von Formularelementen werden in Unterstriche konvertiert.

Wie kann ich Array aus einem HTML-Formular erstellen?

Um die Formularwerte als Array im PHP-Skript zur Verfügung zu haben, müssen Sie die <input>, <select> or <textarea>-Felder wie folgt benennen:

<input name="MeinArray[]" />
<input name="MeinArray[]" />
<input name="MeinArray[]" />
<input name="MeinArray[]" />
Beachten Sie die eckigen Klammern hinter dem Variablen-Namen, denn dadurch wird das Array erst erzeugt. Sie können Felder in verschiedenen Arrays gruppieren, wenn Sie verschiedenen Feldern die gleichen Namen geben:
<input name="MeinArray[]" />
<input name="MeinArray[]" />
<input name="MeinAnderesArray[]" />
<input name="MeinAnderesArray[]" />
Daraus werden zwei Arrays, MeinArray und MeinAnderesArray erstellt. Es ist auch möglich, spezielle Schlüssel anzugeben:
<input name="AnderesArray[]" />
<input name="AnderesArray[]" />
<input name="AnderesArray[email]" />
<input name="AnderesArray[telefon]" />
Das Array AnderesArray enthält daraufhin die Schlüssel 0, 1, email und telefon.

Hinweis:

Die Angabe von Array-Schlüsseln ist in HTML optional. Wenn Sie keinen Schlüssel angeben, wird das Array in der Formular-Reihenfolge gefüllt. Im ersten Beispiel enthält also die Schlüssel 0, 1, 2 und 3.

Siehe auch: Array-Funktionen und Variablen aus externen Quellen.

Wie bekomme ich alle Werte aus einem "select multiple"-HTML-Tag?

Mit einem "select multiple"-Tag können Benutzer mehrere Werte aus einer Liste auswählen. Diese Werte werden dann an den "action handler" des Formulars (z.B. ein PHP-Skript) übergeben. Problematisch ist dabei, dass alle mit demselben Namen übergeben werden, z.B.:

<select name="var" multiple="yes">
Jede ausgewählte Option wird übergeben als:
var=option1
var=option2
var=option3
      
Jede Option wird den Inhalt der vorherigen $var-Variablen überschreiben. Die Lösung ist, die spezielle PHP-Lösung hierfür zu verwenden. Sie sollten das Tag wie folgt umschreiben:
<select name="var[]" multiple>
PHP weiß dann, dass $var als Array behandelt werden soll. Jede ausgewählte Wert wird dem Array hinzugefügt. Das erste Element wird zu $var[0], das nächste zu $var[1] etc. Die count()-Funktion kann benutzt werden, um herauszufinden, wie viele Optionen ausgewählt wurden. Mit der sort()-Funktion können Sie bei Bedarf das Array sortieren.

Beachten Sie, dass, falls Sie JavaScript benutzen, die eckigen Klammern [] im Feldnamen Probleme machen können, wenn Sie versuchen, über den Namen auf das Feld zu verweisen. Benutzen Sie stattdessen die numerische ID des Formularfelds oder schließen Sie den Variablennamen in einfache Anführungszeichen ein und benutzen Sie dies als den Index, z.B.:

variable = document.forms[0].elements['var[]'];
      

Wie kann ich eine Variable von JavaScript an PHP übergeben?

Da JavaScript (normalerweise) nur auf dem Client läuft, während PHP (normalerweise) auf Servern läuft, und da HTTP ein "status-loses" Protokoll ist, können zwischen den beiden Sprachen keine Variablen direkt ausgetauscht werden.

Allerdings ist es trotzdem möglich, Variablen zwischen den beiden zu übergeben. Eine Möglichkeit ist, den JavaScript-Code mit PHP zu generieren. Außerdem muss die angezeigte Seite sich regelmäßig selbst aktualisieren und dabei bestimmte Variablen an das PHP-Skript übergeben. Das folgende Beispiel zeigt wie Sie dies tun können -- es ermöglicht PHP, die Bildschirmauflösung (Höhe und Breite) zu ermitteln, was normalerweise nur Client-seitig möglich ist.

Beispiel #4 JavaScript mit PHP generieren

<?php
if (isset($_GET['width']) AND isset($_GET['height'])) {
// Ausgabe der beiden Größenangaben
echo "Die Bildschirmbreite ist: ". $_GET['width'] ."<br />\n";
echo
"Die Bildschirmhöhe ist: ". $_GET['height'] ."<br />\n";
} else {
// Übergabe der Größenangaben
// (der ursprüngliche 'QUERY_STRING' wird beibehalten;
// POST-Variablen müssen anders behandelt werden)

echo "<script language='javascript'>\n";
echo
" location.href=\"{$_SERVER['SCRIPT_NAME']}?{$_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo
"</script>\n";
exit();
}
?>

add a note add a note

User Contributed Notes 7 notes

up
1
murphy
4 years ago
The scenario:

1. There is a php script which (possibly complemented by a direct written HTML code) consrtucts a HTML page via its echo command, based on whatever algoritmus eventually based on supplementary data from server files or databases.

2. This php script leads to data being saved into string variable(s), which (possibly) can contain arbitrary characters, including control codes (newline, tab...), HTML special characters (&,<...) and non-ASCII (international) characters.

3. These non-ASCII characters are UTF-8 encoded, as well as the HTML page (I do highly recommend) *)

4. The values of these PHP string variables have to be transferred into javascript variables for further processing by javascript (or exposing these values in HTML directly)

The problem:

it is not safe to PHP-echo such variables into HTML (javascript) directly, because some of characters possily contained in them cause malfunction of the HTML. These strings need some encoding/escaping in order to become strings of non-conflicting characters

The solution

There may be a big lot of ways of this encoding. The following one seems to me the easiest one:
The PHP variable with unpredictable value can originate from some file, as an example (or from user input as well):

$variable=file_get_content(...)

1. Convert all bytes of that string into hex values and prepend all hex-digit-pairs with %

$variable_e=preg_replace("/(..)/","%$1",bin2hex($variable))

The new variable is now guarantied to contain only %1234567890abcdefABCDEF chracters (e.g. %61%63%0a...) and can safely be directly echoed into HTML:

var variable="<?php echo $variable_e;?>" //that's NOT all folks

But now the value is still encoded. To get the original value of the variable, it has te be decoded: *)

var variable=decodeURIComponent("<?php echo $variable_e;?>")

The value of the variable is now the same as the original value.

*) I have no idea about non-UTF-8 encoded pages/data, espetially how the decodeURIComponent works in such a case, because i have no reason to use other encodings and handle them as highly deprecatad.

WARNING: this approach is not (generally) safe against code injection. I highly recommend some further check (parsing) of the value depending on the particular case.

P.S. For very large amount of data, I would recomment to save them into file on the PHP side (file_put_content) and read them by javascript via HTTP Request.

I use this approach as it needs one line of code on server as well as client side. I do agree with arguement that not all chaeacters have to be encoded.

Do not enjoy my possibly stupid solution, if you have a better idea

murphy
up
-4
Anonymous
3 years ago
I think the last example on this page may have a XSS vulnreability, e.g. sending the query string ?a="+alert('XSS')+" might cause alert('XSS') to be executed in the browser. The problem with that is that " will be percent encoded by the browser, but there could be some way to bypass the percent encoding and i think it's not good to rely on the percent encoding for security.
up
-5
Anonymous
3 years ago
There is also a very easy XSS with the width and height parameters - they should be passed through htmlspecialchars
up
-21
starbugfourtytwo at gmail dot com
5 years ago
Why use such a complicated example for js to php? why not do this..so we can understand:

javascript:

const variable = "A"

php:

do whatever it takes to get A from javascript
up
-24
smileytechguy at smileytechguy dot com
6 years ago
The (at least that I've found) best way to pass data from PHP to JS is json_encode.  Doing so will convert arrays, strings, numbers, etc. as best as possible.

<?php
$myInt
= 7;
// a bunch of special characters to demonstrate proper encoding
$myString = <<<EOF
" ' ; &\ $
EOF;
$myArr = [1, "str", 2];
$myAssocArr = ["foo" => "bar"];
?>

<script>
var myInt = <?= json_encode($myInt) ?>;
var myString = <?= json_encode($myString) ?>;
var myArr = <?= json_encode($myArr) ?>;
var myAssocArr = <?= json_encode($myAssocArr) ?>;
</script>

This will render the following JS code, which correctly stores the variables:
<script>
var myInt = 7;
var myString = "\" ' ; &\\ $";
var myArr = [1,"str",2];
var myAssocArr = {"foo":"bar"};
</script>

Do note that there are no "s or anything like that around the json_encode output; json_encode handles that for you.
up
-58
jetboy
18 years ago
While previous notes stating that square brackets in the name attribute are valid in HTML 4 are correct, according to this:

http://www.w3.org/TR/xhtml1/#C_8

the type of the name attribute has been changed in XHTML 1.0, meaning that square brackets in XHTML's name attribute are not valid.

Regardless, at the time of writing, the W3C's validator doesn't pick this up on a XHTML document.
up
-63
Jay
10 years ago
If you have a really large form, be sure to check your max_input_vars setting.  Your array[] will get truncated if it exceeds this.  http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars
To Top