begin process at 2012 02 12 06:30:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Formulaires

 > VALIDATION DE FORMULAIRE (PHP4)

VALIDATION DE FORMULAIRE (PHP4)


 Information sur la source

Note :
2 / 10 - par 1 personne
2,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Formulaires Classé sous :validation formulaire, php4, adaptable Niveau :Initié Date de création :20/01/2008 Date de mise à jour :20/01/2008 13:14:21 Vu / téléchargé :11 642 / 546

Auteur : niteowl

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 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

  • 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;
  • }
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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

20 janvier 2008 13:02:17 :
Ajout de balises php pour le rendre plus beau
20 janvier 2008 13:14:21 :
Ajout d'un zip contenant un exemple complet (formulaire + script)

 Sources de la même categorie

Source avec Zip VÉRIFICATION DE FORMULAIRE EN PHP par psonic13
Source avec Zip Source avec une capture CALENDRIER RÉSERVATION POUR CHAMBRES D'HÔTES EN PHP MYSQL par oallais
Source avec Zip Source avec une capture UPLOADEUR DE FICHIERS MULTIPLES V1 par cod57
FORM, ORM POUR FORMULAIRE par choy
Source avec Zip Source avec une capture LOGIN SHA1 + CRÉATION UTILISATEUR par aventurier19

 Sources en rapport avec celle ci

CLASSE PHP4 DE CONNEXION À UN SGBD par gr43
Source avec Zip CLASSE DOMDOCUMENT COMPATIBLE PHP4 ET PHP5 par ordiman85
Source avec Zip [PHP4.3.X-DOMXML]-CREATION D'UN MOTEUR DE TEMPLATE GRACE A D... par jean84
Source avec Zip [PHP4] MOTEUR DE TEMPLATE par jean84

Commentaires et avis

Commentaire de yoman64 le 20/01/2008 16:08:42

Salut,

Ta regex pour valider les addresses courriels n'est pas bonne, elle bloque des addresses valides selon la RRC et elle laisse passer des addresses non valides. La RFC permet les lettres de a-z A-Z 0-9 _ - + ' & =  $ @ # / * % } { | ^ ` ? . (le point ne peux pas débuter l'addresse si je me souviens bien) et j'en oublis surment. En plus les domaines peuvent contenir des accents.

Évidement je suis conscient que rare sont les personnes qui doivent introduire des charactères non alphanumérique dans leurs addresse mais bon...

Commentaire de niteowl le 20/01/2008 21:46:14

Pour être honnête, je n'ai jamais pris le temps de comprendre comment fonctionne ereg, alors j'ai repris cette expression de php.net. Les accents passent alors qu'ils ne devraient pas, c'est vrai.
A la place de [a-zA-Z0-9._-] il faut mettre [:alnum:] qui ne laisse pas passer les accents. Par contre je ne sais pas comment y ajouter les caractères "-", "_", et ".". Une aide serait la bienvenue.

Pour ceux que ça intéresse, les expressions régulières :
http://fr.php.net/manual/fr/ref.regex.php
Les normes RFC :
http://www.faqs.org/rfcs/rfc2822.html
http://www.faqs.org/rfcs/rfc1035.html

Commentaire de brunoperel le 20/01/2008 22:17:06

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.

Commentaire de yoman64 le 21/01/2008 12:08:42

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

Commentaire de twisteurwin le 21/01/2008 18:22:09

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{ } ...)
<input type="text" id="obl_nom" name="obl_nom" value="<?php echo $_POST['obl_nom']; ?>" .../>

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)

Commentaire de alphanono le 28/01/2008 08:14:43

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¤¤¤<input value="¤¤¤value_obl_nom¤¤¤" type="text" name="obl_nom" class="<?= @$err["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

Commentaire de Jayadeva le 29/01/2008 22:14:00 2/10

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...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

php 3 et php4 [ par php ] C'est quoi la difference de php 3 et de php 4 ? Hébergeur ASP/PHP4 [ par xav ] J'ai trouvé un hébergeur qui fait de l'asp/php4, c'est webcentrale.com. Leurs prix sont tout à fait raisonnables et je suis vraiment très content de l Nom de variable... [ par RockmanX ] Voilà,j'ai un fichier que je vais appeler form.php4 qui contient 1 input : &lt;INPUT TYPE='text' NAME='quantite".$idarticle."' VALUE='".$nbrarticle."' PHP3 et PHP4 sur Free [ par mehdibou ] Bonjour,j'aimerais savoir si mettre l'extension .php3 au lieu de .php chez l'hebergeur Free, va améliorer la vitesse. Ou si c'est pas le contraire ou Variable dans une session [ par RockmanX ] Voila,je voudrais stocker des données dans une session nommée session_user qui s'ouvre à la suite d'un formulaire de login si le mot de passe et le no execution php [ par elanspeech ] Bonjour,J'ai installe php4.3.1, la page php de login s'execute et me demande login et mot de passe.J'entre les informations, la reexcution de la page Sessions en php3 [ par Tomcube ] Voilà, pour sécuriser mon script d'upload pour Free en php3, on m'a dit que les sessions en php3 étaient gérées différement en php3 et en php4. Le pro passage de varaibles php4 [ par michelvernet2 ] bonjour,pour passer la variable X du fichier A vers le fichier B, il faudra parait il bientot déclarer la variable X dans B par une instruction du typ Problemes PHP4 et sessions [ par gaga38 ] Salut a tous, voila j'ai un petit probleme avec les sessions PHP4, je suis sure que ca doit etre une grosse betise, mais je sais pas laquelle Dans mo


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales