controles des champ et correction du formulaire PHP

controles des champ et correction du formulaire PHP - PHP - Programmation

Marsh Posté le 11-12-2004 à 22:27:51    

Bonsoir à tous
 
J'ai un petit formulaire avec des champs texte et liste deroulante je sais verifier si le champ est vide ou pas et une fois le questionnaire validé ce que j'aimerai faire c'est faire apparaitre le formulaire avec toutes les cases rempli correctement et en haut ecrit en rouge une ligne indiquant les champ a corriger et je ne connais pas la meillieur façon de le faire. Et si tous les champs sont bon alors j'afficherai un echo avec un recvap de tous les champs
 
Merci d'avance pour votre aide

Reply

Marsh Posté le 11-12-2004 à 22:27:51   

Reply

Marsh Posté le 11-12-2004 à 23:37:50    

Bein tu recuperes toutes les variables et les valeurs postées (avec un balayage de $_POST[]) .. Je sais pas si c'est ca que tu demandais ...

Reply

Marsh Posté le 11-12-2004 à 23:39:35    

Je dirais, à la réception du form :
- un flag du genre $erreur, false par défaut ;
- une suite de if vérifiant la validité de chaque champ, avec un echo en cas d'erreur et $erreur qui passe à true ;
- si $erreur vaut true (au moins une erreur), réaffichage du formulaire, sinon affichage du récap.


Message édité par sielfried le 11-12-2004 à 23:40:05

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-12-2004 à 04:39:26    

+1 pour les autres
si une valeur à été rensignée, tu la met en "value" du formulaire au réaffichage de celui-ci, ce qui évite de la resaisir et un message correspondant au champ pas rempli (tu test dans un if et au 1er champ important pas rempli tu sort --> de maniere itérative le "posteur" va finir par tout remplir ;))


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 15-12-2004 à 11:21:34    

Yo
 
Voilà un exemplaire de formulaire. Je n'ai reproduit que les parties interessantes.
Il y a quelques subtilités à cause de problème potentiels de codage :
- la BDD est en ISO-8859
- la page est en unicode (UTF-8)
- le formulaire doit être entré en ISO, mais il faut quand même prévoir le cas du navigateur qui envoi les données en unicode :o
 
En bref, l'algo c'est :
SI données envoyées
  ALORS vérifier la validité des données
SI pas de données OU données invalides
  ALORS afficher formulaire (pré-rempli avec données, si existantes)
SI données envoyées et valides
  ALORS enregister dans la BDD
 

Code :
  1. <?php
  2. //'gestion' des erreurs
  3. error_reporting(0);
  4. $bug_mes = '<p>Une erreur majeure s\'est produite, l\'administrateur va recevoir un rapport d\'incident.<br />Le processus d\'inscription n\'a pas pu s\'achever, merci de réessayer ultérieurement.<br />Nous nous excusons de ce désagrément indépendant de notre volonté.</p>';
  5. //definitions utiles pour la suite
  6. define('UC_CHARS','ÄÇÈÉËÏÑÖÜ');
  7. define('LC_CHARS','äçèéëïñöü');
  8. //fonction de formatage de texte accentué
  9. function FormatPnom($param) {
  10. if (!strlen($param)) return '';
  11.   $param = strtolower(strtr($param,UC_CHARS,LC_CHARS));
  12.   $param_1 = explode(' ',$param);
  13.   for ($i = 0; $i < count($param_1); $i++){
  14.    $param_2 = explode('-', $param_1[$i] );
  15.    for ($j = 0; $j < count($param_2); $j++) $param_2[$j]{0} = strtoupper(strtr($param_2[$j]{0},LC_CHARS,UC_CHARS));
  16.  $param_1[$i] = implode('-',$param_2);}
  17.   return implode(' ',$param_1);}
  18. function FormatUp($param) {
  19.   return strtoupper(strtr($param,LC_CHARS,UC_CHARS));}
  20. function FormatLow($param) {
  21.   return strtolower(strtr($param,UC_CHARS,LC_CHARS));}
  22. ?>
  23. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  24.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  25. <html xmlns="http://www.w3.org/1999/xhtml">
  26.   <head>
  27.     <title>Inscription ^_^</title>
  28.     <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  29.     <link type="text/css" rel="stylesheet" href="../style.css" />
  30.   </head>
  31.   <body>
  32.  <p><a href="../../.">Menu principal</a> > <a href="./.">^_^</a> > Inscription en ligne</p>
  33.     <div id="corps">
  34.       <p class="intro">Bienvenue sur le formulaire d'inscription en ligne</p>
  35.   <hr />
  36. <?php
  37. // debut de la partie interactive du formulaire
  38. ( $_POST['vali'] == 'Valider') ? ($vali = TRUE) : ($vali = FALSE);
  39. //verification des erreurs du formulaires
  40. if ($vali) {
  41. $err = FALSE; //on part du principe qu'il n'y a pas d'erreur  
  42. if ( !strlen($_POST['civi']) ) $err = $civi_err = TRUE;
  43. if ( !strlen($_POST['pnom']) ) $err = $pnom_err = TRUE;
  44. if ( !strlen($_POST['fnom']) ) $err = $fnom_err = TRUE;
  45. if ( strlen($_POST['ntel']) < 9 ) $err = $ntel_err = TRUE;
  46. }
  47. //conservation des valeurs dans les champs en cas d'erreur
  48. if ($err) {
  49. $civi_aff = $_POST['civi'];
  50. $pnom_aff = stripslashes (utf8_encode(FormatPnom(mb_convert_encoding(trim($_POST['pnom']),'ISO-8859-1', 'UTF-8,ISO-8859-1'))));
  51. $fnom_aff = stripslashes (utf8_encode(FormatUp(mb_convert_encoding(trim($_POST['fnom']),'ISO-8859-1', 'UTF-8,ISO-8859-1'))));
  52. $ntel_aff = $_POST['ntel'];
  53. }
  54. //affichage initial, ou s'il y a des erreur  
  55. if ( !$vali or $err ) {
  56. ?>
  57.       <h1>Formulaire :</h1>
  58. <?php
  59. if($err) echo '      <p class="red">Les champs en rouge ont été omis ou comportent des erreurs, merci d\'apporter les corrections nécessaires.</p>'."\n";
  60. else echo '      <p>Veuillez saisir les renseignements suivants (les champs en gras doivent impérativemet être renseignés) :</p>'."\n";
  61. ?>
  62.       <form method="post" accept-charset="ISO-8859-1">
  63.         <table border="0" cellpadding="3" cellspacing="3">
  64.           <tr>
  65.             <td<?php if($civi_err) echo ' class="red"'; ?>><strong>Civilité</strong>&nbsp;:&nbsp;</td>
  66.             <td><input type="radio" name="civi" value="m" <?php if($civi_aff=='m') echo 'checked="checked" '; ?>/>M.&nbsp;&nbsp;
  67.      <input type="radio" name="civi" value="e" <?php if($civi_aff=='e') echo 'checked="checked" '; ?>/>Mme.&nbsp;&nbsp;
  68.      <input type="radio" name="civi" value="l" <?php if($civi_aff=='l') echo 'checked="checked" '; ?>/>Mlle.</td>
  69.           </tr>
  70.           <tr>
  71.             <td<?php if($pnom_err) echo ' class="red"'; ?>><strong>Prénom</strong>&nbsp;:&nbsp;</td>
  72.             <td><input name="pnom" type="text" size="60" maxlength="60" value="<?php echo $pnom_aff; ?>"/></td>
  73.           </tr>
  74.           <tr>
  75.             <td<?php if($fnom_err) echo ' class="red"'; ?>><strong>Nom</strong>&nbsp;:&nbsp;</td>
  76.             <td><input name="fnom" type="text" size="60" maxlength="60" value="<?php echo $fnom_aff; ?>"/></td>
  77.           </tr>
  78.           <tr>
  79.             <td<?php if($ntel_err) echo ' class="red"'; ?>><strong>Nº de téléphone</strong>&nbsp;:&nbsp;</td>
  80.             <td><input name="ntel" type="text" size="30" maxlength="30" value="<?php echo $ntel_aff; ?>"/></td>
  81.           </tr>
  82.         </table>
  83.       </form>
  84. <?php
  85. }
  86. if ( $vali and !$err ) {
  87. // formatage des données
  88. $civi_c = substr($_POST['civi'],0,1);
  89. $pnom_c = substr(FormatPnom(mb_convert_encoding(trim($_POST['pnom']),'ISO-8859-1', 'UTF-8,ISO-8859-1')),0,60);
  90. $fnom_c = substr(FormatUp(mb_convert_encoding(trim($_POST['fnom']),'ISO-8859-1', 'UTF-8,ISO-8859-1')),0,60);
  91. $ntel_c = substr(trim($_POST['ntel']),0,30);
  92. //connexion à la base de donnée
  93. $db = pg_connect("host=^_^ user=^_^ password=^_^" );
  94. if(!$db) {
  95. echo $bug_mes;
  96. $bug_str = gmdate('Y-m-d H:i:s').';formulaire.php;connection impossible à la BDD'."\n";
  97. error_log($bug_str, 3, "erreurs.log" );
  98. exit;
  99. }
  100. if(pg_set_client_encoding($db,'LATIN2')){
  101. $bug_str = gmdate('Y-m-d H:i:s').';formulaire.php;changement encodage client impossible'."\n";
  102. error_log($bug_str, 3, 'erreurs.log');
  103. }
  104. //donnees supplementaires
  105. $date = gmdate('Y-m-d H:i:s');
  106. //recuperation d'un n° de sequence unique qui sera envoyé par mail comme n° d'enregistrement
  107. $req = pg_exec($db,"SELECT nextval('[...]_seq');" );
  108. if(!$req) {
  109. echo $bug_mes;
  110. $bug_str = gmdate('Y-m-d H:i:s').';formulaire.php;impossible de recuperer un n° de sequence'."\n";
  111. error_log($bug_str, 3, "erreurs.log" );
  112. exit;
  113. }
  114. $tmp = pg_fetch_row($req);
  115. $nume = $tmp[0];
  116. //on enregiste tout ca dans la base
  117. $req = pg_exec($db,"INSERT INTO [...];" );
  118. if(!$req) {
  119. echo $bug_mes;
  120. $bug_str = gmdate('Y-m-d H:i:s').';formulaire.php;impossible d\'enregister une inscription'."\n";
  121. error_log($bug_str, 3, "erreurs.log" );
  122. exit;
  123. }
  124. else echo '<p>Enregistrement réussi.</p>';
  125. //on ferme la bdd
  126. pg_close($db);
  127. //ensuite on envoi le mail de confirmation de l'inscription
  128. }
  129. ?>
  130.       <hr />
  131.     </div>
  132.   </body>
  133. </html>


Message édité par sylva1n le 15-12-2004 à 11:30:51

---------------
Sylvain ®_©
Reply

Marsh Posté le 15-12-2004 à 11:43:41    

Pour être prevenu par mail en cas de pépin, je fais aussi un  

Code :
  1. error_log($bug_str, 1, 'debug@w00t.org', 'From: debug@w00t.org');


en même temps que le

Code :
  1. error_log($bug_str, 3, "erreurs.log" );


mais je l'ai enlevé pour que le bloc de code soit plus digeste :) ... le vrai formulaire fait 308 lignes, avec plus de champs, et les fonctions de mise en forme du nom (tout en majuscule) et du prénom (majuscule initiales).


---------------
Sylvain ®_©
Reply

Marsh Posté le 15-12-2004 à 14:51:50    

Sielfried a écrit :

Je dirais, à la réception du form :
- un flag du genre $erreur, false par défaut ;
- une suite de if vérifiant la validité de chaque champ, avec un echo en cas d'erreur et $erreur qui passe à true ;
- si $erreur vaut true (au moins une erreur), réaffichage du formulaire, sinon affichage du récap.


 
Je fais ça, avec éventuellement un code erreur particulier.

Reply

Marsh Posté le 24-01-2005 à 23:02:34    

Dans le cas du réaffichage du formulaire comment y ajouter les valeurs déja entrées. Et comment aussi changer les intitulés à corriger en rouge ?

Reply

Marsh Posté le 24-01-2005 à 23:10:01    

Sylva1n,
 
pourrai-tu développer ces problèmes de compatibilité de standard de texte ?
 
Aussi apparement lors d'erreurs tu réaffiche le formulaire avec les champs pré-rempli en recodant tout le formulaire. Ne pourrai-t-on pas envisager placer ce foumulaire dans un .php et ensuite l'appeler avec un include mais dans ce cas est-il toujours possible de modifier certaine propriété du texte dans le formulaire. Le but étant de coder une seule et unique fois le formulaire (pratique en cas de modification).
 
Et pur finir, ton code de formatage des noms en majuscules et des prénoms m'intersse. t'est il possible de le diffuser ?
 
Merci d'avance.

Reply

Marsh Posté le 24-01-2005 à 23:20:00    

Citation :

1. <tr>
2. <td<?php if($pnom_err) echo ' class="red"'; ?>><strong>Prénom</strong>&nbsp;:&nbsp;</td>
3. <td><input name="pnom" type="text" size="60" maxlength="60" value="<?php echo $pnom_aff; ?>"/></td>
4. </tr>


Nothing a écrit :

Dans le cas du réaffichage du formulaire comment y ajouter les valeurs déja entrées.


Ligne 3 : la variable $pnom_aff contient $POST[pnom] une fois nettoyée (codage ISO/UTF, supression du code HTML, ...etc).

Nothing a écrit :

Et comment aussi changer les intitulés à corriger en rouge ?


Ligne 2 : la variable $pnom_err passe à vrai si $POST[pnom] ne passe pas les vérification (les expressions régulières, c'est le pied pour ça)


---------------
Sylvain ®_©
Reply

Marsh Posté le 24-01-2005 à 23:20:00   

Reply

Marsh Posté le 25-01-2005 à 02:15:01    

merci Sylv1n.
Il faut donc utiliser les feuilles de style ou je me plante complétement ? (cd 'class="red"'

Reply

Marsh Posté le 25-01-2005 à 09:36:18    

Moi j'avais fait ça différement. C'était pour un formulaire d'envoi d'email (facilement modifiable pour l'insertion dans une base de données). En gros on tapotte la page en HTML normal, et on rajoute juste quelques fonctions dans les input, ça donnait quelque chose du genre :

Code :
  1. <?php
  2. require_once('MailForm.php');
  3. $mf = new MailForm(array('lecastor2001@yahoo.fr', 'dotnet@hotmail.fr'), 'Demande de renseignements', 'email', array('nom', 'comment'));
  4. $mf->send_mail();
  5. if($mf->action == NULL || $mf->field_error) {
  6. ?>
  7. <form id="mailform" action="?action=send" method="post">
  8. <div id="mailfields">
  9.  <label for="nom">Nom * :</label> <input id="nom" type="text" name="nom" <?php $mf->text('nom') ?> /><br />
  10.  <label for="email">E-Mail * : </label><input id="email" type="text" name="email" <?php $mf->text('email') ?> /><br />
  11.  <label for="comment">Commentaire * :</label><textarea id="comment" name="comment"><?php $mf->textarea('comment') ?></textarea><br />
  12.  <input type="checkbox" id="list" name="list" <?php $mf->checkbox('list', true) ?> /><label for="list"> S'inscrire à la mailing list</label>
  13. </div>
  14. <p id="mailerror">
  15.  <?php $mf->display_error(); ?>
  16. </p>
  17. <div id="mailbuttons">
  18.  <input id="send" type="submit" value="Envoyer" /><input id="reset" type="reset" value="RAZ" />
  19. </div>
  20. </form>
  21. <?php $mf->generate_verif('mailform'); ?>
  22. <?php  } elseif(!$mf->sent) { ?>
  23. <p>Une erreur est survenue lors de l'envoi de l'e-mail.</p>
  24. <?php } else { ?>
  25. <p>L'e-mail a été envoyé.</p>
  26. <?php } ?>


 
Ca permet de tapotter son formulaire en HTML, et sans trop rajouter de PHP. L'idée en fait, c'est les petites fonctions (genre $mf->text('nom')) qui réaffiche les valeurs si besoin est, et qui permettent aussi de définir des valeurs par défaut. Si ça t'intéresse, j'peut te filer le truc :) Aussi, je gère la validation de l'email s'il y en a un, et un p'tit javascript est généré pour la validation côté client (tout en gardant une validation côté serveur pour ceux qui ont javascript désactivé).

Reply

Marsh Posté le 25-01-2005 à 10:30:50    

Nothing a écrit :

merci Sylv1n.
Il faut donc utiliser les feuilles de style ou je me plante complétement ? (cd 'class="red"'


On peut faire sans ... mais c'est quand même quasiment indispensable d'utiliser les CSS aujourd'hui ! :D


---------------
Sylvain ®_©
Reply

Marsh Posté le 25-01-2005 à 11:38:48    

Bon faut que je bosse les feuilles de style...
 
merci encore.

Reply

Marsh Posté le 25-01-2005 à 21:11:51    

Ok je me suis donc renseigné sur le CSS.
 
Il faut donc que je réaffiche le formulaire avec les champs déja rempli et appliquer une CSS différente c'est ça ?
 
Mais dans ce cas je suis donc obligé de coder une seconde fois le formulaire ou puis-je faire un include ("formulaire.php" ) et dans ce cas comment remplir les champs avec les données précédentes ?


Message édité par nothing le 25-01-2005 à 21:12:26
Reply

Marsh Posté le 25-01-2005 à 21:38:21    

Nothing a écrit :

Ok je me suis donc renseigné sur le CSS.
 
Il faut donc que je réaffiche le formulaire avec les champs déja rempli et appliquer une CSS différente c'est ça ?
 
Mais dans ce cas je suis donc obligé de coder une seconde fois le formulaire ou puis-je faire un include ("formulaire.php" ) et dans ce cas comment remplir les champs avec les données précédentes ?


 
Non pas appliquer une CSS différente, utiliser une class CSS différente suivant que le champs est correct ou pas, oui


Message édité par naceroth le 25-01-2005 à 21:40:49
Reply

Marsh Posté le 25-01-2005 à 22:27:49    

Ok merci naceroth.
 
Et pour passer les valeurs déja écrites suis-je donc obliger de ré-écrire le formulaire ? ou include ?

Reply

Marsh Posté le 26-01-2005 à 01:21:16    

Non, un include du formulaire c'est bon, du moment que ton fichier peut récupérer les données envoyées précédement (et gérer le cas où il en a pas, pour éviter les messages d'erreur idiots :D)

Reply

Marsh Posté le 27-01-2005 à 23:29:09    

Ok merci naceroth,
c'est un dans la même optique que je compte m'y prendre.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed