FAQ PHP
FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
- À quel moment effectuer la vérification?
- Que faut-il vérifier ?
- Comment vérifier les données renvoyées par formulaire (POST) ?
- Pourquoi mes valeurs de champs textes de formulaires sont-elles coupées après le premier espace ?
- Contrôler et réafficher un formulaire avec les valeurs déjà saisies
- Comment afficher le contenu de POST/GET, SESSION ou SERVER ?
- Comment récupérer la position de la souris après un clic sur un submit de type image ?
- Comment gérer un formulaire avec deux submit ?
- Comment vérifier qu'une chaine comporte uniquement des chiffres et des opérateurs arithmétiques ?
- Comment conserver la sélection d'un menu déroulant après une soumission ?
- Comment extraire les valeurs d'un SELECT multiple ?
- Comment savoir combien de variables ont été postées ?
- Comment redéfinir comme valeur par défaut d'une liste multiple les choix effectués dans cette liste?
- Comment récupérer les informations d'un champ de type file ?
- Comment empêcher les méfaits du bouton actualiser (renvoi de formulaire) ?
a) Avant l'envoi du formulaire La vérification avant envoi ne peut se faire en PHP, PHP étant un langage serveur, elle devra donc être faite à l'aide d'un langage client, généralement javaScript. Cette vérification est utile dans le sens oû elle évite d'envoyé des données mal formatées vers le serveur, mais elle n'est pas fiable, car on ne peut contrèler de manière certaine le client et ce qu'il envoie (le javaScript peut être désactivé dans le navigateur, par exemple).
b) Avant enregistrement C'est le meilleur moment pour vérifier les données, ceci assure que les données enregistrées respectent les règles fixées. La vérification avant enregistrement ne doit cependant porter que sur la validité du format des données et leur compatibilité avec les outils et supports (bdd, php).
c) Avant l'utilisation À ce moment, les données devraient déjà être validées. Si ce n'était pas le cas, ça voudrait dire que des données invalides ont été sauvegardées, ce qui n'est pas acceptable. Il se peut cependant que des données doivent être préparées en vue d'une utilisation particulière, par exemple en supprimant les tags HTML pour l'affichage sur une page web. Dans ce cas seulement, une vérification des données se fera avant leur utilisation.
- Les caractères interprétables par HTML et les caractères accentués ou spéciaux
C'est la fonction htmlspecialchars() qui se charge de remplacer les caractères suivants* : & ' " < > par leur entité HTML. Cette fonction est également très utile si on veut présenter un exemple de code HTML dans une page web.
Quant aux caractères accentués ou spéciaux, c'est la fonction htmlentities() qui est sollicitée. Elle fonctionne de la même manière que htmlspecialchars() mais s'applique à tous les caractères qui ont un équivalent en entité HTML. il est également possible d'ignorer les quote simples et doubles.
* Il est possible de faire ignorer les quotes simple et doubles par la fonction. - Si on a à faire à une chaîne vide :
Il est parfois utile de savoir si on a affaire à une chaîne vide, afin de ne pas enregistrer la donnée ou d'ajouter une valeur par défaut.
En utilisant l'instruction suivante, il est possible de le savoir.
Lien : Comment se protéger de la faille XSS ?
Lien : Comment se protéger des failles d'injection ?
Soit le champ de formulaire de méthode POST suivant :
Tester si $_POST["mon_champ"] est un entier :
if (is_numeric($_POST
[
'
mon_champ
'
]
) &&
(intval(0
+
$_POST
[
'
mon_champ
'
]
) ==
$_POST
[
'
mon_champ
'
]
)) {
echo '
Saisie correcte !
'
;
}
else {
echo '
Saisie incorrecte !
'
;
}
Tester si $_POST["mon_champ"] est un réel :
if(is_numeric($_POST
[
'
mon_champ
'
]
)) {
echo '
Saisie correcte !
'
;
}
else {
echo '
Saisie incorrecte !
'
;
}
Tester si $_POST["mon_champ"] est une adresse email valide :
La syntaxe d'un champ input de type text est la suivante :
<input type
=
"text"
name
=
"nom"
value
=
"valeur"
/>
Selon la norme XHTML, les valeurs des attributs des balises doivent être délimitées par des doubles quotes.
Dans ce dernier exemple, si la variable $nom comporte des espaces, le navigateur n'interprétera pas le reste de la chaîne de caractères.
De même, si cette variable contient des doubles quotes, il faudra les déspécialiser avec la fonction htmlentities() ou htmlspecialchars(), sinon ils vont interférer avec les doubles quotes de délimitation de la valeur d'attribut.
Pour construire un formulaire simple sur ce modèle, il faut deux choses :
1 - A chaque élément du formulaire, donner comme attribut value la variable PHP correspondant à l'attribut name :
echo '
<input type="text" name="nounours" value="
'
.
$_POST
[
'
nounours
'
].
'
">
'
;
Attention, cette option ne fonctionne pas (ou mal) avec les champs FILE, car pour des raisons de sécurité, elle est désactivée sur la plupart des navigateurs.
2 - effectuer le traitement et l'affichage du formulaire dans la même page.
$out
=
""
;
if(!
empty($_POST
[
'
nounours
'
]
) &&
isset($_POST
[
'
envoi
'
]
))
{
$out
.=
'
Traitement du formulaire...<br><a href="
'
.
$_SERVER
[
'
PHP_SELF
'
].
'
">Retour</a>
'
;
}
else
{
// Le formulaire est envoyé mais le champ nounours n'est pas rempli
if(isset($_POST
[
'
nounours
'
]
) &&
(isset($_POST
[
'
envoi
'
]
)))
{
$out
.=
'
vous n
\'
avez pas rempli le champ nounours
'
;
}
$out
.=
'
<form action="
'
.
$_SERVER
[
'
PHP_SELF
'
].
'
" method="POST" enctype="application/x-www-form-urlencoded">
<input type="text" name="nounours" value="
'
.
htmlentities($_POST
[
'
nounours
'
]
).
'
">
<input type="submit" name="envoi" value="OK">
</form>
'
;
}
echo $out
;
Lien : Les formulaires et PHP5, par Guillaume Rossolini
Lien : Comment se protéger de la faille XSS ?
Lien : Comment se protéger des failles d'injection ?
Cela peut être utile pour vérifier le contenu des données
transmises par un formulaire quelque soit la méthode
($_GET ou $_POST).
On utilise donc la fonction
print_r()
qui affiche des informations à propos d'une variable, de
manière à ce qu'elle soit lisible.
Exemple :
echo '
<pre>
'
;
print_r($_GET
);
// Affiche tout le contenu de la variable $_GET
echo '
</pre>
'
;
Ce code peut également être utilisé pour afficher le contenu de $_POST, $_SESSION ou $_SERVER
Lien : Comment afficher (pour vérification) le contenu d'un tableau ?
D'un point de vue purement esthétique, il est parfois préférable d'utiliser un bouton image plutôt qu'un banal bouton submit pour envoyer un formulaire.
<form method
=
"post"
action
=
"page.php"
>
...
<input type
=
"image"
name
=
"img_envoi"
src
=
"image_envoi.gif"
>
</form>
Après envoi de ce formulaire en ayant cliqué sur l'image, on récupère les coordonnées du point sur l'image, là où a été effectué le clic de souris, les coordonnées étant calculées par rapport au point 0,0 de l'image (haut gauche).
<?php
$Coords_X
=
$_POST
[
"img_envoi_x"
]
;
$Coords_Y
=
$_POST
[
"img_envoi_y"
]
;
echo 'Vous avez cliqué aux coordonnées ('
.
$Coords_X
.
', '
.
$Coords_Y
.
')'
;
?>
Toutefois, si vous avez attribué un effet de style (CSS) sur la balise Input, et que vous vouliez par exemple la positionner, ou simplement la faire afficher au dessus d'un autre calque vous serez face à un problème sous Firefox. En effet, il ne gère pas bien le positionnement CSS d'un tel élément HTML car il additionne le déplacement par CSS aux coordonnées envoyées (oui, c'est un bug). La solution est de placer l'INPUT dans un DIV et de positionner le DIV au moyen de la CSS.
Exemple :
Pour savoir quel bouton submit a été cliqué, on effectue un test sur l'attribut name lors de la soumission.
Exemple :
Une fois de plus, on va faire appel aux expressions régulières et à la fonction preg_match.
if (preg_match('
#(^[\d(]+[ +*()/\d-]*[\d)]+$)#
'
,
$txt
)) {
// c'est ok
...
}
Avec ce masque, il est même possible de remplacer toutes les opérations par leur résultat dans une chaine quelconque :
$txt
=
'
(5 + 2) * 11
'
;
$txt
=@
preg_replace('
#([\d(]+[ +*()/\d-]*[\d)]+)#e
'
,
"
'<b>'.round(
$0
, 3).'</b>'
"
,
$txt
);
echo $txt
;
// va afficher 77
Il vaut mieux vérifier avant qu'elle ne renvoie pas d'erreur (ou utiliser l'inhibiteur d'erreur), une parenthèse non fermée ou une division par zéro va entrainer une erreur.
Soit une liste dans un formulaire contenant cinq prénoms. Afin de retenir la sélection de l'internaute, nous allons définir le cible du formulaire comme le script lui même :
<?php
$selected
=
isset( $_GET
[
'prenom'
]
) ?
$_GET
[
'prenom'
]
:
""
;
$selectedValue
=
'selected="selected"'
;
?>
<
form method=
"
get
"
>
<
select name=
"
Prend
"
>
<
option value=
"
Jean
"
<?php
if
( $selected
==
"Jean"
) echo $selectedValue
?>
>
Jean</
option>
<
option value=
"
Bob
"
<?php
if
( $selected
==
"Bob"
) echo $selectedValue
?>
>
Bob</
option>
<
option value=
"
Marie
"
<?php
if
( $selected
==
"Marie"
) echo $selectedValue
?>
>
Marie</
option>
<
option value=
"
Charlotte
"
<?php
if
( $selected
==
"Charlotte"
) echo $selectedValue
?>
>
Charlotte</
option>
</
select>
<
br/>
<
input type=
"
submit
"
value=
"
Envoyer
"
/>
</
form>
Il suffit de déclarer correctement son SELECT en HTML :
<select name
=
"variables[]"
multiple
=
"multiple"
>
<option value
=
"x"
>
xxx</option>
...
</select>
Puis de récupérer le tableau $variable dans le script d'arrivée :
ou encore
Il faut bien évidemment que le formulaire et son traitement se trouvent dans le même fichier. Vous devez d'abord récupérer les valeurs de cette liste si le formulaire a déjà été envoyé
<?php
$listemul
=
$_POST
[
"listemul"
]
;
Rappel : comme on utilise une liste multiple, pour pouvoir récupérer toutes les valeurs sélectionnées, il faut en faire un tableau (par conséquent on a récupéré un tableau).
On veut donc ensuite afficher le formulaire avec comme valeurs pré-sélectionnées les choix qui ont été effectués précédemment. On doit donc vérifier pour chaque option de la liste si sa valeur se trouve dans le tableau que l'on a récupéré. Pour cela, on utilise la fonction in_array(arr, cherche[, boolstrict]) qui va vérifier si la valeur cherche se trouve dans le tableau arr. Le paramètre optionnel boolstrict effectue une vérification sur le type de cherche et de la valeur trouvée (inutile ici).
Le code du formulaire:
<
form method
="
post
"
>
<
select name
="
listemul[]
"
size
="
4
"
multiple
>
<
option value
="
0
"
<?php
if
(isset($listemul
) &&
in_array('0'
,
$listemul
)) echo "selected"
;
?>
>
choix 1<
/option
>
<
option value
="
1
"
<?php
if
(isset($listemul
) &&
in_array('1'
,
$listemul
)) echo "selected"
;
?>
>
choix 2<
/option
>
<
option value
="
2
"
<?php
if
(isset($listemul
) &&
in_array('2'
,
$listemul
)) echo "selected"
;
?>
>
choix 3<
/option
>
<
option value
="
3
"
<?php
if
(isset($listemul
) &&
in_array('3'
,
$listemul
)) echo "selected"
;
?>
>
choix 4<
/option
>
<
/select
>
<
input type
="
submit
"
>
<
/form
>
On utilise également la fonction isset() pour vérifier que le tableau $listemul existe, dans le cas contraire, la fonction in_array() sur une variable qui n'existe pas provoquerait une erreur.
- $_FILES['nomDuChamp']['name'] : le nom original du fichier
- # $_FILES['nomDuChamp']['type'] : le type MIME du fichier
- # $_FILES['nomDuChamp']['tmp_name'] : l'endroit provisoire où se trouve le fichier sur le serveur
- # $_FILES['nomDuChamp']['error'] : le code d'erreur encontrée (0 = OK)
- # $_FILES['nomDuChamp']['size'] : la taille du fichier en octets
Note : Ne pas oublier d'ajouter l'attribut enctype dans la balise form.
Lien : Quels sont les différents paramètres et explications que peut prendre enctype ?
Lien : Tutoriel : Upload de fichiers en PHP, par Antoine Hérault
Lien : Les formulaires et PHP - La superglobale $_FILES
Le bouton actualiser du navigateur est souvent "problématique" car à l'issue de l'envoi d'un formulaire il aura pour effet de vous faire parvenir exactement les mêmes données. Vous les reprendriez donc en compte et obtiendriez au final des informations dupliquées. Il est totalement inutile de supprimer, même en partie, le tableau $_POST car s'agissant d'un nouvel appel de votre script (le client émet une nouvelle requête HTTP), ce tableau sera donc recréé. Il existe plusieurs solutions pour s'en prémunir, la plus simple et la plus efficace étant de rediriger le navigateur.
- Cette méthode doit envoyer des entêtes HTTP. Par conséquent, il vous sera impossible d'envoyer un quelconque texte au client ;
- La solution faisant appel aux cookies, les sessions peuvent être concernées : elles seront sans effet pour un client qui ne gère ou n'accepte pas les cookies.
Lien : Tutoriel de formulaire réparti sur plusieurs pages, par Guillaume Rossolini