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 :

Formulaire HTML côté client

L2 L3 M1 M2 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 :

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

L2 L3 M1 M2
Traitement du formulaire côté serveur

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

Traitement du formulaire côté serveur

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

Traitement du formulaire côté serveur

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

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

Exemple de valeurs numériques

Traitement du formulaire côté serveur

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

L2 L3 M1 M2
Traitement du formulaire côté serveur