PHP et HTML sont très interactifs : PHP peut générer du HTML et HTML
peut passer des informations à PHP. Avant de lire cette faq (foire aux
questions), il est important d'apprendre comment récupérer des variables externes à PHP.
La page du manuel correspondante contient beaucoup d'exemples.
Il y a plusieurs étapes pour lesquelles le codage est important. En supposant qu'il y a une string $data, qui contient la chaîne à passer de manière non-encodée, voici les étapes appropriées :
Interprétation HTML. Afin d'indiquer une chaîne aléatoire, il faut l'inclure entre doubles guillemets et utiliser la fonction htmlspecialchars() pour encoder la chaîne.
URL : une URL est constituée de plusieurs parties. Si les données doivent être interprétées comme un seul élément, il faut les encoder avec la fonction urlencode().
Exemple #1 Un élément de formulaire HTML caché
<?php
echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>Note: Il n'est pas correct d'utiliser la fonction urlencode() pour les données $data, car il en est de la responsabilité du navigateur de les encoder. Tous les navigateurs populaires le font correctement. Il est à noter que cela s'effectue sans considération de la méthode utilisée (c'est-à-dire
GETouPOST). Il faut uniquement noter ce cas pour les requêtesGET, car les requêtesPOSTsont généralement cachées.
Exemple #2 Données éditables par l'utilisateur
<?php
echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data)."\n";
echo "</textarea>";
?>Note: Les données sont montrées dans le navigateur comme prévues, car celui-ci interprétera les symboles HTML échappés. Au moment de la validation, via la méthode
GETouPOST, les données devraient être url-encodées par le navigateur avant le transfert et directement url-décodées par PHP. Donc, finalement, il n'est pas nécessaire d'effectuer d'url-encodage/url-decodage soi-même, tout est effectué automatiquement.
Exemple #3 Dans une URL
<?php
echo '<a href="' . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . '">'."\n";
?>Note: En fait, lors de la simulation d'une requête
GETHTML, il est nécessaire d'utiliser manuellement la fonction urlencode() sur les données.
Note: Il faut utiliser htmlspecialchars() sur l'URL complète, car l'URL se comporte comme la valeur d'un attribut HTML. Dans ce cas, le navigateur fera un htmlspecialchars() sur la valeur et passera le résultat à l'URL. PHP devrait comprendre l'URL correctement, car les données ont été url-encodées. Il est à noter que
&dans l'URL est remplacé par&. Bien que la plupart des navigateurs devraient corriger cela en cas d'oubli, ce n'est pas toujours le cas. Donc, même si l'URL n'est pas dynamique, il faut utiliser la fonction htmlspecialchars() sur l'URL.
Lors de la validation d'un formulaire, il est possible d'utiliser une image au lieu du bouton
standard de type "submit" avec une balise du type :
<input type="image" src="image.gif" name="foo" />
Comme foo.x et foo.y sont des noms de variables invalides en PHP, elles sont automatiquement converties en foo_x et foo_y. Les points sont remplacés par des soulignés. Donc, il faut accéder à ces variables comme n'importe quelle autre variable tel que décrit dans la section "Variables provenant d'autres sources". Par exemple, en utilisant $_GET['foo_x'].
Note:
Les espaces dans les noms de variables de requête sont également convertis en tirets bas.
Pour envoyer le résultat du <form> comme un tableau
de variables au script PHP, il faut nommer, via l'attribut name, les balises
<input>, <select> ou <textarea> comme cela :
<input name="MonTableau[]" /> <input name="MonTableau[]" /> <input name="MonTableau[]" /> <input name="MonTableau[]" />
<input name="MonTableau[]" /> <input name="MonTableau[]" /> <input name="MonAutreTableau[]" /> <input name="MonAutreTableau[]" />
<input name="UnAutreTableau[]" /> <input name="UnAutreTableau[]" /> <input name="UnAutreTableau[email]" /> <input name="UnAutreTableau[telephone]" />
Note:
Le fait de spécifier une clé à un tableau est optionnel en HTML. Sans spécification, les clés du tableau suivront l'ordre d'apparition des éléments dans le formulaire. Dans notre premier exemple, le tableau contient les clés 0, 1, 2 et 3.
Voir aussi les fonctions sur les tableaux de variables et la section sur les variables provenant d'autres sources.
SELECT
multiple ?
Le champ SELECT multiple en HTML permet à l'utilisateur de
sélectionner plusieurs éléments d'une liste.
Ces éléments seront transmis à la page pointée par l'attribut
action de la balise form.
Le problème est que ces éléments sont tous passés avec le même nom de variable.
<select name="var" multiple="yes">
var=option1
var=option2
var=option3
<select name="var[]" multiple="yes">
Il est à noter que lors de l'utilisation de Javascript, [] dans le nom de l'élément peut
poser problème lors de l'accès à celui-ci par son nom.
Utiliser plutôt l'indice numérique de l'élément dans ce cas, ou bien les simples
guillemets pour entourer cet élément, comme :
variable = document.forms[0].elements['var[]'];
Javascript est (habituellement) une technologie côté client et PHP est (habituellement) une technologie côté serveur et sachant que HTTP est un protocole « sans état », les deux langages ne peuvent pas directement partager des variables.
Cependant, il est possible de faire passer des variables entre les deux. Une des solutions pour cela est de générer un code Javascript à l'aide de PHP et de faire rafraîchir le navigateur tout seul, passant ainsi des variables spécifiques au script PHP. L'exemple suivant montre précisément comment réaliser cela -- il permet au code PHP de récupérer les dimensions de l'écran du client, ce qui est normalement uniquement possible côté client.
Exemple #4 Génération de Javascript avec PHP
<?php
if (isset($_GET['largeur']) AND isset($_GET['hauteur'])) {
// Affichage des variables
echo 'La largeur de l\'écran est : ' . $_GET['largeur'] ."<br />\n";
echo 'La hauteur de l\'écran est : ' . $_GET['hauteur'] . "<br />\n";
} else {
// passage des variables de dimensions
// (préservation de la requête d'origine
// -- les variables par méthode POST doivent être traitées différemment)
echo "<script language='javascript'>\n";
echo " location.href=\"{$_SERVER['SCRIPT_NAME']}?{$_SERVER['QUERY_STRING']}"
. "&largeur=\" + screen.width + \"&hauteur=\" + screen.height;\n";
echo "</script>\n";
exit();
}
?>