Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Comment contrôler les entrées de vos formulaires ?

Chacun d'entre vous a déjà été confronté au contrôle des entrées de formulaire.

Du isset() pas vraiment efficace à de l'htmlentities() sur tout ce qui bouge, on trouve de tout et on trouve surtout n'importe quoi !

Loin de moi l'idée de vous donner la recette miracle et passe-partout qui va sécuriser et contrôler tous vos formulaires, car elle n'existe pas. Mais alors me direz-vous, qu'est ce que tu va bien pouvoir nous dire de plus que ce qu'on ne sait déjà ?
Je sais pas... peut-être rien de nouveau, mais je vais quand même essayer.

Même si les portions de code sont fonctionnelles en l'état, elles ne servent que de support dans la méthode de vérification. Vous devrez opter pour une forme plus rigoureuse de vérification avec les données sur lesquelles l'internaute à la main ainsi que de vérifier la conformité de votre code HTML.


Ceci étant dit, voilà, c'est parti !

On va faire très simple avec comme base un formulaire de renseignement se composant de 5 champs.

Cas N°1 - Tous les champs sont obligatoires

C'est le cas de figure le plus simple, on vérifie tout !
Plutôt que de vérifier les 5 champs séparément, on va utiliser une boucle pour tout faire en une fois et surtout pour alléger son code.

<?php
error_reporting(E_ALL);

if(!empty($_POST))
{
foreach($_POST as $cle=>$val)
{
if(empty($val))
{
echo 'Le champ ',$cle,' est obligatoire.<br />';
}
}
}
else
{
echo '
<form method="post" action="#">
<div class="bloc350" id="formu">
<fieldset>
<label>Nom :</label><input type="text" name="nom" />
<br />
<label>Prénom :</label><input type="text" name="prenom" />
<br />
<br />
<label>Année de naissance :</label><input type="text" name="naissance" />
<br />
<label>Pseudo :</label><input type="text" name="pseudo" />
<br />
<label>Mot de passe :</label><input type="text" name="pass" />
<br />
<input type="submit" value="Envoyer les données" />
</fieldset>
</div>
</form>
';
}
?>

Voilà, faites le test tel quel et vous verrez le résultat.
Bon ouais ok, ça fonctionne mais on est quand même limité dans ses mouvements car il faut passer par le bouton "Page précédente" du navigateur pour corriger.

Allez zou..., on va faire mieux avec cette portion !

<?php
error_reporting(E_ALL);
if(!empty($_POST))
{
$retour=1;
foreach($_POST as $cle=>$val)
{
if(empty($val))
{
echo 'Le champ ',$cle,' est obligatoire.<br />';
$retour=0;
}
}
if($retour==0)
{
echo '<a href="javascript:history.go(-1);">Corriger ou complètez les champs erronés !</a>';
}
else
{
echo 'C\'est bon, on poursuit donc l\'exécution du script';
}
}
else
{
echo 'Idem formulaire exemple précédent';
}
?>

Explication :
On garde le même principe que l'autre portion sauf que l'on va initialiser une variable nommée $retour ayant pour valeur 1 et qui nous servira de "coupe-circuit"
Regardez bien le code, vous trouverez la variable $retour=1; juste avant le foreach.

Dans la condition !empty() qui vérifie les champs, on va insérer la variable $retour=0;
Si la boucle vérifie un champ vide, la valeur de $retour passera alors à 0 et notre coupe-circuit sera actif.

En sortie de boucle, on place un if de contrôle du coupe_circuit if($retour==0)
Si $retour=0, on affiche alors un lien qui permet de retourner sur le formulaire afin de corriger les champs vides.
Si $retour=1, c'est que tous les champs sont corrects et on continue alors l'exécution du script.

Et voilà, on a maintenant un script complet qui vérifie la totalité des champs du formulaire.

Piqûre de rappel :
Je pense qui'l est bon de vous rappeler les fonctionnalités de !empty()

!empty vérifie que la variable existe, qu'elle n'est pas vide ou qu'elle n'est pas égale à 0.
Cette syntaxe :
<?php
if(isset($_POST['nom'])&& $_POST['nom']!='' && $_POST['nom']!=='0'))
?>

est exactement la même chose que :
<?php
if(!empty($_POST['nom']))
?>

Vous le constatez par vous même, il n'y a pas photo, la deuxième version est plus courte et plus rapide que l'autre.

Donc, si tous vos champs sont obligatoires et qu'aucun d'eux ne peut valoir 0, !empty fera merveille.

Il est bon de noter que l'ajout d'une vérif supplémentaire tel que trim() sera le complément idéal.
Ce qui nous donnerait : if(empty($val) || trim($val)=='') à la place de if(empty($val))

Cas N°2 - Seuls certains champs sont obligatoires

Ici, on a toujours notre foreach, mais on va créer un array supplémentaire pour indiquer les champs que nous souhaitons rendre obligatoire.

<?php
error_reporting(E_ALL);
$obligatoire=array('nom','prenom','pseudo','pass');
if(!empty($_POST))
{
$retour=1;
foreach($obligatoire as $val)
{
if(empty($_POST[$val])||trim($_POST[$val])=='')
{
$corrige[]=$val;
$retour=0;
}
}
if($retour==0)
{
echo 'Les champs ',implode(', ',$corrige),' sont obligatoires<br /><br />
<a href="javascript:history.go(-1);">Corriger ou complètez les champs erronés !</a>';
}
else
{
echo 'C\'est bon, on poursuit donc l\'exécution du script';
}
}
else
{
echo 'Idem formulaire exemple précédent';
}
?>


Et voilà, pour ce deuxième cas, je ne donne pas d'explications, je vous laisse chercher un peu si vous ne comprenez pas du premier coup.

Il y a plusieurs méthodes pour vérifier les entrées de formulaires, je vous en ai livré deux.
Il est clair que ces portions sont basiques et que je vous laisse le loisir de les améliorer et de les adapter à votre situation, tant au niveau du code Php que du code HTMl qui n'est fourni qu'à titre de code d'essai.
Vérifier donc la syntaxe et la validité des différentes balises.
ADAM Benjamin 2008 | Admin