Du côté client, avec HTML et JavaScript, il n'y a malheureusement pas de méthodes sûres qui permettent de vérifier que les valeurs saisies sont correctes et que les valeurs envoyées sont bien celles que l'on attend. Même si la nouvelle version de HTML (HTML5) offre des attributs permettant de définir la validité d'une zone, ils sont dans la réalité peu utilisables puisque maintenant tous les navigateurs offre des outils qui permettent de voir et surtout modifier dynamiquement le code HTML des pages affichées (touche F12 dans Chrome et Internet Explorer, extension Firebug ou crtl+maj+Q dans Firefox). La validation avec JavaScript n'est pas suffisante non plus car il suffit de désactiver JavaScript dans le navigateur ou avec les outils proposés pour qu'aucune validation ne soit faite.

Il faut donc mettre en place sur le serveur les procédures qui permettent de valider les informations que l'on reçoit "de l'extérieur" (ie Internet), et ce, quelque soit la provenance de ces informations (formulaires en POST, données en GET, cookies, en-têtes HTTP si on les utilise, etc).

Les éléments reçus et accessibles par les tableaux $_POST et $_GET (et généralement tous les autres tableaux $_QUELQUECHOSE) sont considérés par PHP comme des chaînes de caractères, et ce même si l'élément contient un nombre.

La validation de type numérique est la plus simple à réaliser et va consister en 2 choses :

- vérifier que les données reçues sont bien un nombre
- vérifier que ce nombre est bien compris dans une plage acceptable.

Formulaire HTML côté client

Nom Identifiant Cursus
Année L2 L3 M1 M2 Langage préféré
Aimerait plus de cours magistraux
plus de cours en ligne
plus de TD
plus de TP

Dans notre formulaire d'exemple nous attendons que 2 zones contiennent des nombres :

- le numéro d'étudiant,
- l'année d'étude en cours.

Il pourrait sembler surprenant de tester la valeur reçue pour l'année d'étude car cette valeur n'est pas saisie, mais résulte du choix de tel ou tel bouton radio. Ce test est néanmoins obligatoire, car comme dit précédemment, rien n'empêche la personne qui va envoyer le formulaire de modifier facilement les valeurs correspondantes à ces boutons radio avec les outils offerts par les navigateurs.

Pour tester qu'une valeur reçue dans $_POST ou $_GET est bien numérique, il faut utiliser la fonction is_numeric().

Les autres fonctions de test de type numérique ne doivent pas être utilisée à la place de is_numeric() pour tester les éléments de $_POST ou $_GET.

Exemple de valeurs numériques

Identifiant Année L2 L3 M1 M2
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Valider des données numériques'); htmlInfo('Test Identifiant'); if (is_numeric($_POST['txtId'])) { echo $_POST['txtId'], ' est un nombre'; } else { echo $_POST['txtId'], ' n\'est pas un nombre'; } htmlInfo('Test Année en cours'); if (is_numeric($_POST['radAnnee'])) { echo $_POST['radAnnee'], ' est un nombre'; } else { echo $_POST['radAnnee'], ' n\'est pas un nombre'; } htmlFin(); ?>

La fonction is_numeric() détecte bien si les 2 zones ont renvoyé des nombres, mais elle ne permet pas de définir si ces nombres sont des entiers ou pas. On peut par exemple saisir 1.234 dans la zone "Identifiant".

Le test du numéro d'étudiant doit donc être affiné en utilisant par exemple le transtypage pour définir si le nombre saisi est bien un entier.

Exemple de valeurs numériques

Identifiant
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Valider un entier'); htmlInfo('Test Identifiant'); if (! is_numeric($_POST['txtId'])) { echo $_POST['txtId'], ' pas un nombre'; } else { $id = (int) $_POST['txtId']; if ($id == $_POST['txtId']) { echo $_POST['txtId'], ' nombre entier'; } else { echo $_POST['txtId'], ' pas un entier'; } } htmlFin(); ?>

Dernière chose à vérifier pour le numéro d'étudiant : qu'il soit positif. Dans l'état actuel de nos tests, on peut effectivement saisir 0, ou -12345 comme numéro.

Exemple de valeurs numériques

Identifiant
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Valider un entier positif'); htmlInfo('Test Identifiant'); if (! is_numeric($_POST['txtId'])) { echo $_POST['txtId'], ' pas un nombre'; } else { $id = (int) $_POST['txtId']; if ($id == $_POST['txtId']) { if ($id > 0) { echo $_POST['txtId'], ' entier positif'; } else { echo $_POST['txtId'], ' entier non positif'; } } else { echo $_POST['txtId'], ' pas un entier'; } } htmlFin(); ?>

A ce niveau d'imbrication des if le code est devenu incompréhensible. Le recours à des fonctions va nous aider à rendre les choses plus claires.

    /**
     * Teste si une valeur est une valeur entière
     *
     * @param mixed		$x	valeur à tester
     * @return boolean	TRUE si entier, FALSE sinon
    */
    function estEntier($x) {
    	return is_numeric($x) && ($x == (int) $x);
    }
    /**
     * Teste si un nombre est compris entre 2 autres
     *
     * @param integer	$x	nombre à tester
     * @return boolean	TRUE si ok, FALSE sinon
    */
    function estEntre($x, $min, $max) {
    	return ($x >= $min) && ($x <= $max) {
    }

Ces fonctions sont intégrées dans la bibliothèque bib_fonctions.php. Nous pouvons les tester avec la fonction tester utilisée précédemment.

Exemple : test des fonctions de test
<?php require('bib_fonctions.php'); htmlDebut('Test des fonctions de test'); htmlInfo('Fonction estEntier'); tester('estEntier', 100, TRUE); tester('estEntier', -100, TRUE); tester('estEntier', 'abcd', FALSE); tester('estEntier', '', FALSE); tester('estEntier', 0, TRUE); htmlInfo('Fonction estEntre'); tester('estEntre', 10, 0, 1000, TRUE); tester('estEntre', 0, 0, 1000, TRUE); tester('estEntre', 10, 0, 5, FALSE); tester('estEntre', -1, 0, 100, FALSE); tester('estEntre', -1, -100, 0, TRUE); htmlFin(); ?>

Le test du numéro d'étudiant dans notre formulaire devient donc :

Exemple de valeurs numériques

Identifiant
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Valider un entier positif'); htmlInfo('Test Identifiant'); if (estEntier($_POST['txtId']) && estEntre($_POST['txtId'], 1, 99999999)) { echo 'Ok'; } else { echo 'Ko'; } htmlFin(); ?>

Le test le valeur de l'année en cours, saisie avec les boutons radio peut se faire comme suit.

Exemple de valeurs numériques

Année L2 L3 M1 M2
Traitement du formulaire côté serveur
<?php require('bib_fonctions.php'); htmlDebut('Valider un entier positif'); htmlInfo('Test année en cours'); if (estEntier($_POST['radAnnee']) && estEntre($_POST['radAnnee'], 2, 5)) { echo 'Ok'; } else { echo 'Surveiller adresse IP, valeur corrompue'; } htmlFin(); ?>