Nous allons commencer par vérifier le type de variable, puis la forme.
Ensuite, nous verrons comment ajouter des options et comment valider les données provenant de l'utilisateur.
Vérifier le type de la variable
Il est très important de s'assurer que le type de la donnée reçue est bien celui voulu pour éviter d'avoir des problèmes à ce niveau.
Pour valider une variable, il faut utiliser la fonction
filter_var().
La plupart du temps, nous appellerons cette fonction avec 2 paramètres : la variable à valider et le type de filtre.
Il est possible d'envoyer un troisième paramètre : un tableau d'options.
Nous verrons comment utiliser ces options un peu plus tard.
Les entiers
Voyons tout de suite un exemple :
Code : PHP | <?php
$a = 123;
if(filter_var($a, FILTER_VALIDATE_INT) !== false) { //Si la variable est bien un entier.
echo 'La variable est un entier valide !';
}
|
Si vous testez ce code, vous pouvez constater que le texte s'affiche.
Donnez une autre valeur à la variable pour voir :
Code : PHP
Ça fonctionne aussi !
Maintenant, essayons des valeurs qui ne fonctionnent pas :
Code : PHP
Le texte ne s'affiche plus ; c'est parfait !
Allez, un autre test :
Code : PHP
Là non plus le texte ne s'affiche pas.
C'est tout à fait normal, car cette chaîne de caractères ne contient pas que des chiffres, mais aussi des lettres.
Faisons un dernier test pour nous assurer que tout fonctionne :
Code : PHP
Le texte ne s'affiche toujours pas : la validation fonctionne !
Revenons à la ligne qui nous intéresse dans le code :
Code : PHP | <?php
if(filter_var($a, FILTER_VALIDATE_INT) !== false) {
|
Que renvoie la fonction filter_var() ?
Elle renvoie la donnée filtrée (dans ce cas, c'est la valeur de la variable) ou
false si elle n'est pas valide.
Pourquoi ne pas faire tout simplement ceci :
if(filter_var($a, FILTER_VALIDATE_INT)) { ?
Si le nombre est valide, la condition est vraie, non ?
Pas toujours.
Voici un exemple où il ne fonctionne pas :
Code : PHP | <?php
$a = 0;
if(filter_var($a, FILTER_VALIDATE_INT)) { //Ne jamais valider comme ceci !
echo 'La variable est un entier valide !';
}
|
En effet, le texte ne s'affichera pas, car la valeur testée est 0.
Donc, utilisez toujours cette condition :
Code : PHP | <?php
if(filter_var($a, FILTER_VALIDATE_INT) !== false) {
|
Il y a bien deux signes égal (==) après le point d'exclamation parce que nous voulons vérifier le type de variable en plus.
Essayez avec un seul signe égal et vous verrez que ça ne fonctionne pas.
Il a été dit que la fonction
filter_var() retourne la valeur si elle est valide.
À quoi ça sert, puisque nous avons déjà cette valeur ?
En fait, ça retourne la valeur
transtypée si elle n'est pas du bon type.
Voici un exemple :
Code : PHP | <?php
$b = '24';
if($b = filter_var($b, FILTER_VALIDATE_INT)) {
var_dump($b); //Affiche int(24).
}
|
Passons aux autres types de données ; ça ira plus vite maintenant que nous avons vu un exemple.
Les nombres réels
Pour un nombre réel, il faut utiliser la constante FILTER_VALIDATE_FLOAT :
Code : PHP | <?php
$a = 12.4;
if(filter_var($a, FILTER_VALIDATE_FLOAT) !== false) { //Validation d'un nombre réel.
echo 'La variable est un nombre réel valide !';
}
|
C'est simple, non ?
Vérifier la forme de la variable
Il est possible de valider les adresses de messagerie, les liens et les adresses IP grâce aux filtres, et ce, sans utiliser d'expressions régulières !
Les adresses de messagerie
Encore une fois, il suffit de modifier la constante utilisée :
Code : PHP | <?php
$a = 'petitzero@siteduzero.com';
if(filter_var($a, FILTER_VALIDATE_EMAIL) !== false) { //Validation d'une adresse de messagerie.
echo 'La variable est une adresse de messagerie valide !';
}
|
Essayez d'enlever le point (.) ou le @ et vous verrez que le message ne s'affiche plus.
Ce n'est pas parce que l'adresse de messagerie est valide qu'elle existe.
En effet, ici, on ne fait que vérifier la forme de l'adresse.
Les liens
Encore une fois, on ne fait que modifier la constante :
Code : PHP | <?php
$a = 'http://www.siteduzero.com/';
if(filter_var($a, FILTER_VALIDATE_URL) !== false) { //Validation d'un lien.
echo 'La variable est un lien valide !';
}
|
Pour valider, il faut que la variable à tester contienne bien le protocole de communication (exemple : http, ftp, ...).
Le « www » est, bien entendu, facultatif.
Les adresses IP
Cette fois, la constante est FILTER_VALIDATE_IP :
Code : PHP | <?php
$a = '127.0.0.1';
if(filter_var($a, FILTER_VALIDATE_IP) !== false) { //Validation d'une adresse IP.
echo 'La variable est une adresse IP valide !';
}
|
Les adresses IPv6 valident aussi. Vous pouvez essayer avec cette valeur :
Code : PHP | <?php
$a = '2001:0db8:0000:85a3:0000:0000:ac1f:8001';
|
Validation avec options
Passons maintenant à quelque chose de plus intéressant : les options.
Avec les options, il est possible d'ajouter des contraintes supplémentaires.
Options à utiliser avec les entiers
Il existe deux options pour les entiers :
Ces options permettent de préciser une limite minimale et maximale.
Par exemple, si min_range vaut 0, le nombre -5 sera invalide.
C'est maintenant que nous allons nous servir du troisième paramètre de la fonction
filter_var().
Ce paramètre est un tableau ayant l'index
'options' qui contient, lui aussi, un tableau.
C'est dans ce dernier que nous mettrons les index min_range et/ou max_range.
Voici un exemple où nous voulons un entier de 0 à 100 :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | <?php
$a = '64';
$options = array(
'options' => array(
'min_range' => 0,
'max_range' => 100
)
);
if(filter_var($a, FILTER_VALIDATE_INT, $options) !== false) { //Validation d'un entier.
echo 'La variable est un nombre entier valide (compris entre 0 et 100) !';
}
|
Nous créons un tableau avec les index voulus, puis nous passons ce tableau à la fonction
filter_var().
Rien de bien difficile.
Les options des autres types sont moins utilisées.
Les drapeaux
Ce sont des options (ne prenant aucun paramètre) que nous pouvons ajouter.
Par exemple, si je veux que les nombres octaux et hexadécimaux soient valides, je dois ajouter les drapeaux correspondants :
Code : PHP | <?php
$a = '0x64';
$options = array(
'flags' => FILTER_FLAG_ALLOW_HEX | FILTER_FLAG_ALLOW_OCTAL
);
if(filter_var($a, FILTER_VALIDATE_INT, $options)) {
echo 'L\'entier est valide.';
}
|
Dans le tableau options, nous n'utilisons plus l'index 'options', mais plutôt l'index 'flags' (drapeaux, en anglais).
Pour combiner des drapeaux, il faut les séparer à l'aide d'un |.
Vous pouvez également essayer avec une valeur en base 8 :
Code : PHP
Les nombres sont entre apostrophes, car sinon, ils seraient « convertis » en base 10 de telle sorte que l'ajout de ces drapeaux serait inutile.
En PHP, comme dans d'autres langages de programmation, le préfixe à écrire pour préciser qu'un nombre est écrit en hexadécimal est '0x' (un zéro, suivi d'un x) ; pour écrire un nombre octal (en base 8), c'est '0' (un zéro).
Les cas des données utilisateur
(Après tout, c'est l'objet de ce tutoriel.

)
Nous allons maintenant utiliser une nouvelle fonction. Eh oui, il était temps, non ?
Il s'agit de
filter_input() : elle fonctionne comme
filter_var(), mais est adaptée aux données envoyées par l'utilisateur.
Elle prend quatre paramètres, dont les deux premiers sont obligatoires :
- le type (INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV) ;
- l'index du tableau du prédécent paramètre ;
- le filtre à appliquer (exemple : FILTER_VALIDATE_INT) ;
- le tableau d'options.
Cette fois, la valeur de retour est différente.
La fonction retourne :
- la valeur si la donnée est valide ;
- false si elle n'est pas valide ;
- null si elle n'existe pas.
Pourquoi ne pas utiliser simplement filter_var() comme ceci :
filter_var($_GET['variable'], FILTER_VALIDATE_INT) ?
Parce que si
$_GET['variable'] n'existe pas, il s'affichera une erreur.
Regardons ensemble un exemple :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13 | <?php
$resultat = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT);
if($resultat === null) { //Si la variable $_GET['age'] n'existe pas.
echo 'La variable $_GET[\'age\'] n\'existe pas.';
}
elseif($resultat !== false) { //Si elle est valide.
echo 'La variable $_GET[\'age\'] est un entier valide !';
}
else {
echo 'La variable $_GET[\'age\'] n\'est pas valide.';
}
|
Premièrement, nous stockons la valeur de retour de la fonction
filter_input() dans une variable.
Ici, nous nous attendons à obtenir un paramètre dans l'URL nommé « age » et nous vérifions qu'il s'agit bien d'un entier.
La première condition sert à vérifier l'existence de la variable : si elle n'existe pas,
$resultat vaudra
null.
Encore une fois, il faut aussi vérifier le type ; c'est pourquoi nous utilisons les opérateurs === et !==.
La deuxième condition vérifie la validité de la donnée. Si
$resultat est différent de
null et de
false, elle est nécessairement un nombre entier.
Le else (équivalent de
$resultat === false) affiche un message pour dire que la variable n'est pas valide (par exemple, si l'utilisateur a entré « abc »).
Vérifier l'existence d'une donnée utilisateur
Si nous ne voulons vérifier l'existence d'une donnée utilisateur, nous pouvons utiliser la fonction
filter_has_var().
Elle prend deux paramètres :
- le type (INPUT_GET, INPUT_POST, ?) ;
- l'index.
Cette fonction retourne
true si l'index est dans le tableau,
false sinon.
Voici un exemple simple :
Code : PHP | <?php
if(filter_has_var(INPUT_GET, 'age')) {
echo '$_GET[\'age\'] existe';
}
|
Pourquoi utiliser cette fonction si on peut faire la même chose avec filter_input() ?
Parce qu'elle fait moins de tests.
En effet, elle ne vérifie que l'existence d'un index, elle ne valide pas sa valeur.
C'est donc utile dans les cas où nous n'avons pas à vérifier la valeur.
En voyez-vous un ?
Il y en a bien un :
Secret (cliquez pour afficher)... pour les cases à cocher !
En effet, il n'est pas nécessaire de vérifier ce type de valeur, car il suffit de savoir si l'index existe ou non pour effectuer les traitements adéquats.
Nous avons vu bien des notions sur la validation des données, passons maintenant au grand nettoyage.
Quoi ? Ne partez pas !
