Problème vérification format champs

Problème vérification format champs - PHP - Programmation

Marsh Posté le 14-05-2009 à 10:16:27    

Bonjour,
 
Je viens vous demander votre aide, ayant quelques problèmes dans mon formulaire.
 
1. D'abord, j'ai fais une liste de sélection de plusieurs pays. Or, cette liste est très longue !
 
Je ne me vois pas faire :  
 
           if(eregi("pays",$champ))
           {
              if(!ereg("(France|Espagne|Italie|Grèce|Allemagne|Lituanie|Turquie|Finlande|...|...)",$valeur))
              {
                $errors[]="$valeur n'est pas un pays valide.";
              }
           }
... pour 50 pays ! Auriez-vous une solution svp ?
 
 
2. Ensuite, l'internaute doit rentrer sa date de naissance. J'ai testé le code suivant, en indiquant une date invalide, mais après génération du script, il ne m'indique aucune erreur ! Je ne comprends pas....  
 
           if(eregi("dateNaissance",$champ))
           {
              if(!ereg("^([0-9]{2})/([0-9]{2})/([0-9]{4})$",$valeur, $date) and checkdate( $date[2], $date[1], $date[3] ) and $date[3] >= 1900)
              {
                 $errors[] = "$valeur n'est pas une date valide.";
              }
           }
 
           Exemple : dateNaissance = 53-487198.
                          resultat = RIEN !
 
 
3. Enfin, j'ai fait exactement le même test que précédemment, mais cette fois si avec le champ "prenom" et le champ "nom", en indiquant un prénom et un nom invalides. Après génération, PHP m'indique bien une erreur au niveau du prénom, mais pas au niveau du nom ! Voici mon code :
 
     if(eregi("prenom",$champ) and eregi("nom",$champ))
           {
              if (!ereg("^[A-Za-z' -]{1,50}$",$valeur))
              {
                 $errors[] = "$valeur n'est pas valide.";
              }
           }
 
           Exemple : - prenom = Mathilde95'(*  
                            resultat = Mathilde95'(* n'est pas valide.
                         - nom = Durant78- _£  
                           resultat = RIEN !
                       
 
Je vous remercie d'avance pour les réponses que vous m'apporterez.

Reply

Marsh Posté le 14-05-2009 à 10:16:27   

Reply

Marsh Posté le 14-05-2009 à 10:34:57    

Laisse tomber les regexp dans les trois cas :D

 

Pour la liste des pays, j'imagine que tu l'as dans un tableau, ou quelque part ? Vaut mieux utiliser un tableau et in_array.

 

Pour la date de naissance, c'est pas cool de checker la taille des jours mois et années. Y'en a qui vont mettre juste deux chiffres pour l'année, il vaut mieux le gérer que de balancer une erreur.

 

Pour le nom et prenom, vaut mieux juste faire un trim et vérifier la longueur, pas les caractères dedans (surtout que ton truc là, je ne sais pas s'il gère correctement les caractères accentués).


Message édité par FlorentG le 14-05-2009 à 10:35:12
Reply

Marsh Posté le 14-05-2009 à 10:41:37    

Je te remercie pour ta réponse.
 
Pour la liste des pays, je fais appel a eux grâce à une fonction.
 
Sinon, je préfère travailler avec des regex, je début avec PHP je n'ai pas encore vu d'autres possibilités.
 
Je veux bien que tu me traduises tout ce que tu m'as dit en "code" lool

Reply

Marsh Posté le 14-05-2009 à 10:43:25    

D_AmOn a écrit :

Bonjour,
 
Je viens vous demander votre aide, ayant quelques problèmes dans mon formulaire.
 
1. D'abord, j'ai fais une liste de sélection de plusieurs pays. Or, cette liste est très longue !
 
Je ne me vois pas faire :  
 
           if(eregi("pays",$champ))
           {
              if(!ereg("(France|Espagne|Italie|Grèce|Allemagne|Lituanie|Turquie|Finlande|...|...)",$valeur))
              {
                $errors[]="$valeur n'est pas un pays valide.";
              }
           }
... pour 50 pays ! Auriez-vous une solution svp ?
 


 
Fastoche. Mettre les noms des pays dans une liste et faire une boucle sur les pays en mettant un booléen à true si ça concorde. Si aucun concorde (booleen a false apres la boucle), erreur.
 

Citation :


2. Ensuite, l'internaute doit rentrer sa date de naissance. J'ai testé le code suivant, en indiquant une date invalide, mais après génération du script, il ne m'indique aucune erreur ! Je ne comprends pas....  
 
           if(eregi("dateNaissance",$champ))
           {
              if(!ereg("^([0-9]{2})/([0-9]{2})/([0-9]{4})$",$valeur, $date) and checkdate( $date[2], $date[1], $date[3] ) and $date[3] >= 1900)
              {
                 $errors[] = "$valeur n'est pas une date valide.";
              }
           }
 
           Exemple : dateNaissance = 53-487198.
                          resultat = RIEN !


 
J'en sais rien. As-tu vérifié ce qu'il y a dans $date et dans $valeur?
Le code suivant est correct et peut t'éclairer:

Code :
  1. if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {
  2.     echo "$regs[3].$regs[2].$regs[1]";
  3. } else {
  4.     echo "Format de date invalide : $date";
  5. }


 
Ne serait-ce pas ereg et non pas !ereg?
 

Citation :


3. Enfin, j'ai fait exactement le même test que précédemment, mais cette fois si avec le champ "prenom" et le champ "nom", en indiquant un prénom et un nom invalides. Après génération, PHP m'indique bien une erreur au niveau du prénom, mais pas au niveau du nom ! Voici mon code :
 
     if(eregi("prenom",$champ) and eregi("nom",$champ))
           {
              if (!ereg("^[A-Za-z' -]{1,50}$",$valeur))
              {
                 $errors[] = "$valeur n'est pas valide.";
              }
           }
 
           Exemple : - prenom = Mathilde95'(*  
                            resultat = Mathilde95'(* n'est pas valide.
                         - nom = Durant78- _£  
                           resultat = RIEN !
                       
 
Je vous remercie d'avance pour les réponses que vous m'apporterez.


 
Je ne vois qu'une explication: $valeur est bien renseigné dans un cas  et pas dans l'autre. Et ne serait-ce pas ereg et non pas !ereg?

Reply

Marsh Posté le 14-05-2009 à 10:44:19    

Déjà rien que le fait que t'appelle eregi pour le nom du champ [:pingouino] Déjà eregi c'est plus lent que preg_match, ensuite c'est un peu "overkill", suffit de faire :

Code :
  1. if($champ == 'pays')


Donc dégage eregi, et utilise PCRE (preg_match). Et n'en utilise pas pour de simple comparaisons de chaînes.
 

Reply

Marsh Posté le 14-05-2009 à 10:45:46    

la fonction in_array est beaucoup plus simple que la fonction regex, mais beaucoup moins puissante c'est sur aussi
in_array($mavaleur chercher,$montableau);


Message édité par infoman64 le 14-05-2009 à 10:47:25
Reply

Marsh Posté le 14-05-2009 à 11:16:47    

Merci pour vos réponses ; je vais tester tout ça et je reviens !

Reply

Marsh Posté le 16-05-2009 à 18:10:01    

gelatine_velue a écrit :


 
Fastoche. Mettre les noms des pays dans une liste et faire une boucle sur les pays en mettant un booléen à true si ça concorde. Si aucun concorde (booleen a false apres la boucle), erreur.
 

Citation :


2. Ensuite, l'internaute doit rentrer sa date de naissance. J'ai testé le code suivant, en indiquant une date invalide, mais après génération du script, il ne m'indique aucune erreur ! Je ne comprends pas....  
 
           if(eregi("dateNaissance",$champ))
           {
              if(!ereg("^([0-9]{2})/([0-9]{2})/([0-9]{4})$",$valeur, $date) and checkdate( $date[2], $date[1], $date[3] ) and $date[3] >= 1900)
              {
                 $errors[] = "$valeur n'est pas une date valide.";
              }
           }
 
           Exemple : dateNaissance = 53-487198.
                          resultat = RIEN !


 
J'en sais rien. As-tu vérifié ce qu'il y a dans $date et dans $valeur?
Le code suivant est correct et peut t'éclairer:

Code :
  1. if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {
  2.     echo "$regs[3].$regs[2].$regs[1]";
  3. } else {
  4.     echo "Format de date invalide : $date";
  5. }


 
Ne serait-ce pas ereg et non pas !ereg?
 

Citation :


3. Enfin, j'ai fait exactement le même test que précédemment, mais cette fois si avec le champ "prenom" et le champ "nom", en indiquant un prénom et un nom invalides. Après génération, PHP m'indique bien une erreur au niveau du prénom, mais pas au niveau du nom ! Voici mon code :
 
     if(eregi("prenom",$champ) and eregi("nom",$champ))
           {
              if (!ereg("^[A-Za-z' -]{1,50}$",$valeur))
              {
                 $errors[] = "$valeur n'est pas valide.";
              }
           }
 
           Exemple : - prenom = Mathilde95'(*  
                            resultat = Mathilde95'(* n'est pas valide.
                         - nom = Durant78- _£  
                           resultat = RIEN !
                       
 
Je vous remercie d'avance pour les réponses que vous m'apporterez.


 
Je ne vois qu'une explication: $valeur est bien renseigné dans un cas  et pas dans l'autre. Et ne serait-ce pas ereg et non pas !ereg?


 
 
 
Pour mon problème sur les pays, pourrais-tu me faire un exemple de boucle ?

Reply

Marsh Posté le 18-05-2009 à 14:19:10    

Code :
  1. $pays_trouve=false;
  2.      if(eregi("pays",$champ))
  3.     {
  4.        foreach ($liste_pays as $key=>$pays)
  5.        {
  6.      
  7.               if($pays == $valeur)
  8.               {
  9.                   $pays_trouve=true;
  10.               }
  11.        }
  12.     }
  13. if ($pays_trouve)
  14. // C'est ok
  15. else
  16. //Erreur


Message édité par gelatine_velue le 18-05-2009 à 14:19:48
Reply

Marsh Posté le 18-05-2009 à 15:05:53    

Pour les pays, je ne vois pas trop l'utilité d'une boucle...
1. Dans ton formulaire tu dois avoir une liste de choix avec les pays.
2. Tu récupères le champ pays, tu le sécurises, tu le formates bien (tout en minuscules, tout en majuscules, Majuscule sur la première lettre, ...)
3. Tu utlises les fonctions de PHP :

Code :
  1. /*TPays => Array contenant la liste des pays, $pays la variable Pays envoyée par le formulaire et traitée...
  2. in_array ($pays, $TPays) renvoie True si $pays est dans le tableau $TPays
  3. On pourrait aussi utiliser array_search ($pays, $TPays)
  4.   qui renvoie l'index de $pays s'il est dans $TPays, false sinon....
  5. */
  6. if ( !in_array ( $pays, $TPays )) {
  7.   //Traitement de l'erreur
  8.   echo "Pays inexistant";
  9. }
  10. else (


Pour les noms/prénoms, il faudrait tenir compte des accents, espaces et autres signes... j'aurais plutôt tendance à limiter les vérifications à la taille, et à sécuriser l'input...
 
Pour la date, tu as le choix :
1. Utiliser un "calendrier" en javascript (voir sur google). Dans ce cas, tu connais le format théorique de la date. Il te suffit de tester ce que tu récupères...
Par exemple, tu sais que tu récupères une date au format jj/mm/aaaa, il te suffit de faire :

Code :
  1. $Tdate = explode ('/', $madate);
  2. // checkdate est la fonction de base : elle te permet de vérifier que tu as bien une date
  3. // si tu fais des vérifications supplémentaires, tu pourrais le remplacer par une autre fonction..
  4. if (!checkdate($Tdate[1], $Tdate[0], $Tdate[2)) {
  5. // Gestion de l'erreur
  6. }
  7. else {
  8. // Eventuellement des tests supplémentaires...
  9. }


2. Prévoir trois champs : jour, mois et année.
- Tu récupères les trois valeur.
- Tu vérifies qu'elles sont bien numériques.
- Tu vérifies que ça forme une date valide.
 
3. Laisser l'utlisateur saisir ce qu'il veut.
Plus délicat : dans ce cas tu dois accepter JJ/MM/AA ou JJ-MM-AAAA (sans compter les risques de problèmes si tu as des anglo-saxons qui saisissent les dates au format MM/JJ/AAAA).
Le principe reste plu ou moins le même, en plus compliqué... Récupérer la valeur, vérifier que le format correspond à une date (trois nombres séparés par un séparateur), et ensuite vérifier qu'il s'agit d'une date.

Reply

Marsh Posté le 18-05-2009 à 15:05:53   

Reply

Marsh Posté le 27-05-2009 à 09:48:11    

Désolé de ne répondre que maintenant, j'étais en vacances ^^
 
Je vais regarder tout ça, et je te dirai si j'ai réglé mon problème ou pas.

Reply

Marsh Posté le 29-05-2009 à 19:03:47    

Merci pour toutes vos réponses, ça m'a beaucoup aidé, j'ai réglé mes problèmes !!
 
Encore une fois merci !!

Reply

Sujets relatifs:

Leave a Replay

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