Validation de formulaire (php4)

Soyez le premier à donner votre avis sur cette source.

Vue 14 074 fois - Téléchargée 771 fois

Description

Il s'agit de valider en un rien de temps un formulaire, quelque soit le nombre de champs. Le script vérifie le contenu de chaque champ en fonction ce que qu'il devrait contenir (email, nombre, texte...).
Pratique quand on passe son temps à traiter des formulaires (je gagne un temps monstre en utilisant ce script), et indispensable lorsqu'on génère des champs dynamiquement.

Source / Exemple :


Le nom des champs du formulaire commencent par une variable définie : "obl" pour un champ obligatoire, "mel" pour un champ email, etc.
Par exemple : 
<input type="text" name="obl_nom" class="<?= @$err["obl_nom"]; ?>" />
<input type="text" name="mel_email" class="<?= @$err["mel_email"]; ?>" />

Lors de la soumission du formulaire, on appelle une fonction qui va vérifier le contenu de chaque objet du formulaire :

<?php
$err = array(); // déclaration de la variable qui contiendra les erreurs
$err=errForm($_POST); // on appelle la fonction
?>

La fonction :

<?php
function errForm($myForm) {
   $errArray = Array(); 	// ce tableau va contenir toutes les variables qu'on souhaite renvoyer. 
   $class_ok="chp_ok"; 		// on définit une var pour si le champ est ok. "chp_ok" est le nom du style CSS
   $class_nok="chp_nok"; 	// cette var est attribuée si le champ n'a pas été rempli correctement. "chp_nok" est le nom du style CSS
   $errArray["myErr"]=0; 	// var d'erreur : 0 si le formulaire est correctement rempli, sinon, 1 

    // on parcourt le tableau qu'on a récupéré en argument 
    foreach ($myForm as $key => $myVar) {
      $myVar=trim($myVar); // histoire de virer les espaces en trop
      
      $errArray[$key]=$class_ok; // par défaut, on considère que le champ a été rempli correctement

      switch ( substr($key, 0, 3) ) { // on récupère le préfixe de chaque nom de champ (obl, mel pour l'exemple ci-dessus)
      case "obl":
         if ($myVar=="") { // si la variable commence par obl, elle ne doit pas être vide (champ obligatoire) 
            $errArray[$key]=$class_nok; // si le champ n'a pas été correctement rempli, on le "tagge" : $key est le nom du champ. $errArray[$key] stocke une valeur ("chp_nok") qui correspondra dans la partie html du formulaire, à une classe CSS
            $errArray["myErr"]=1;
         }
         break;

      case "mel": // si la variable est un mail
         if ( !ereg("[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]",$myVar) ) {
            $errArray[$key]=$class_nok;
            $errArray["myErr"]=1;
         }
         break;

      }
      return $errArray;
}
?>

Juste après l'appel de la fonction, on vérifie s'il y a des erreurs et on réagit en fonction :
<?php
if ($err["myErr"]==0) {
      // récuperation des valeurs, ...
}else {
      // renvoyer sur formulaire, indiquer un message...
}
?>

Dans le CSS, on indique les styles associés à un champ en erreur et à un champ OK
.chp_ok {
   border:1px solid #000000;
}

.chp_nok {
   border:1px solid #CC0000;
}

Conclusion :


La fonction fonctionne également avec $_GET, $_SESSION, n'importe quel tableau à une dimension passé en paramètre.
Pour traiter une date, un nombre... il suffit d'ajouter à la fonction les quelques lignes correspondantes :
case "dat": // si la variable commence par dat, elle doit être une date
if ($myVar!="") {
$jour=substr($myVar,0,2);
$mois=substr($myVar,3,2);
$annee=substr($myVar,6,4);
if (!checkdate($mois,$jour,$annee)) {
$errArray["myErr"]=1;
}
}
break;

case "pwd": // si la variable est un mot de passe, elle doit contenir entre 6 et 12 caratères et ne doit contenir que des caratères alphanumériques
if ( (strlen($myVar)<6) || (strlen($myVar)>12) || (!ereg("^:alnum:+$", $myVar)) ) {
$errArray["myErr"]=1;
}
break;

Les combinaisons sont infinies. On peut augmenter ou réduire la taille du préfixe, inclure le "_" dans le substr, bref c'est compètement modulable et adaptable à chaque besoin et développeur.

Dans cet exemple j'ai utilisé des champs "text" mais ça fonctionne avec tout type de champ. Attention cependant avec le CSS qui fonctionne bizarrement avec les boutons radio et les checkbox.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
67
Date d'inscription
mercredi 2 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2008

Basique, sans plus. Une validation de formulaire vérifierai le type (string, integer ...). La forme (email, ip, date, ...). Si c'est requis ou non. Le nombre maximum et minimum de caractères autorisé. Et plus encore.

Ensuite, au lieux de faire :
<<<
$err=errForm($_POST);
>>>
J'aurais directement pris $_POST dans la fonction...

La déclaration de la variable "$err" est aussi inutile que pluie sur roche. D'autant plus que "$err" pourrait retourner false si l'argument qui lui est donné n'est pas de type 'array' ou pour toute autre raison...

Je ne critique pas pour enfoncer, mais pour faire réfléchir sur le but originel : proposer quelque chose de fonctionnel et d'utile. Ici, ça peu peut-être être utile ... Aussi, n'hésite pas a aller regarder le code des outils déjà existant - style framework - pour voir comment ils font.

Pour moi, un code utile, c'est un code qui me permet d'aller plus vite. Ici, tu vérifie juste si le champ existe et si il est valide s'il est un mail...
Messages postés
39
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
25 mai 2009

Mouais ... je trouve ça aussi niveau débutant. C'est extra simplifié pour une fonction de vérification de formulaire.

Je note pas mal de problèmes. Je pense que le faite qu'un champ est obligatoire doit être séparé de la vérification de la forme. Par exemple, un champ doit pouvoir être de type mail et obligatoire ou de type mail mais pas obligatoire. Ou de type nombre et obligatoire ou non ...

Bien sûr, il manque plein de fonctions de vérifications.

Ensuite, je pense que le plus intéressant serait de regrouper tout ça dans une classe pour faire la vérification d'un coup du formulaire, en stocker les résultats en cas d'erreur pour pouvoir les retourner au formulaire, gérer des messages d'erreur en fonction du type d'erreur ... Souvent l'idéal dans le cas de traitement de formulaire est d'utiliser une classe de template en parallèle. Tu prends un template ou tu crée un formulaire du genre : ¤¤¤erreur_obl_nom¤¤¤" /> et la classe est capable de retourner les valeurs dans les tags ¤¤¤value_...¤¤¤ et les messages d'erreur dans les tags ¤¤¤erreur...¤¤¤.

Enfin, pour pousser encore les fonctionnalités d'un traitement de formulaire, on peut faire en sorte que la classe puisse se coupler à une base de donnée pour en enregistrer automatiquement les résultats en cas de succès où aller chercher les valeurs des champs dans une base de données dans le cas d'une modification d'un enregistrement existant.

En bref, c'est un bon début, mais pour que ce soit vraiment pratique, il faudrait encore pousser tout ça.

Bon courage
Messages postés
167
Date d'inscription
mardi 21 septembre 2004
Statut
Membre
Dernière intervention
2 mai 2009

Hello World,

a)Il Manque juste la récupération des valeurs déjà envoyées dans le cas ou il y a des champs vides ou mal remplis...
avec une petite structure conditionnelle de base...(if(){ }elseif{ } ...)
" .../>

b)[... class="<?= @$err["obl_nom"]; ?>] devient: [...class="<?php echo $err['obl_nom']; ?>]
* J'ai enlevé @ devant la var car en principe tu dois faire les contrôles pour éviter les erreurs donc une petite structure conditionnelle de base en gros (if(){ }elseif{ } ...)

Hum initié ca dépend pour qui, la, je pense que c'est du code pour débutant !
Je noterai après les petites modifications ^^ Bye (ca veut dire ciao en anglais lol)
Messages postés
592
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
4 décembre 2008

Les accents sont tout à fait valides, un domaine peut parfaitement contenir un accent donc de ce coté c'est correct. Par contre il y a aussi la longueur limité a 64charactères pour la mailbox et le domaine limité a 255.

Mais c'était plus une remarque comme ça,je ne suis pas expert des regex et je me doute que pour respecter à la perfection une addresse mail la regex risque d'être très complexe. Je suis même pas sur qu'une regex suffise.

Donc c'était une simple remarque, pas vraiment une critique ;)
Et la meilleure place pour avoir la syntaxe c'est la RFC 3696: http://www.faqs.org/rfcs/rfc3696.html

Bonne continuation
Messages postés
14
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
6 octobre 2008

Pour le "." et le "-" tu rajoutes simplement \ avant ==> [a-zA-Z0-9\._\-]
Pour l'underscore je ne crois pas qu'il y ait besoin de l'échappement.
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (niteowl)