Formulaire special

Résolu
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009 - 3 févr. 2009 à 16:08
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009 - 5 févr. 2009 à 06:33
bonjour

j'ai une bout de script hyper connue et hyper facile

se script est pour un formulaire

moi j'aimerai que sur se bout de formulaire qui est destiner a y mettre son code postal
on puise y mettre que des chiffre et pas plus que 5

pouvais vous me dire si c'est possible et comment je peut faire svp voici le script :

 <td><label for="cp"><?php echo 'Code Postal'; ?></label></td>
 <td></td>

cordialement

29 réponses

kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 févr. 2009 à 20:51
Salut,

Pour être encore plus simple :
if (strlen($_POST['cp']) == 5 && is_numeric($_POST['cp'])) ...

Je n'ai pas testé des masses mais ça devrait fonctionner.

Cordialement,

Kohntark-
3
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 févr. 2009 à 22:20
Ouaip, bon, même chose pour ctype_digit, faut mettre une condition sur la plongeur de la chaîne sinon ça ne sert à rien :

if (strlen($_POST['cp']) == 5 && ctype_digit($_POST['cp'])) {

Par ailleurs il faut que tu testes systématiquement l'existence des données POST :

if (isset($_POST['cp']) && strlen($_POST['cp']) == 5 && ctype_digit($_POST['cp'])) {

... et d'une manière générale faire un strip_tags avant de les utiliser, ce qui n'est pas nécessaire ici puisque le test contrôle qu'il n'y a que des chiffres (ne pas réutiliser directement $_POST['cp'] ailleurs par contre)

Kohntark -
3
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 févr. 2009 à 22:33
lunixman :
 - strlen($_POST['cp']) : ici tu ne test pas si c'est égal a 5. Sans ce test, ceci est évalué a faux si la chaine est vide et a vrai dans el reste des cas.
 - ctype_digit($_POST['cp']) : ceci va être évalué a vrai si la chaine représente un nombre entier et a faux dans les autres cas.
Conclusion : l'expression est vrai si la chane est non nule et représente un entier.

Utilise donc le code donné par Kohntark juste au dessus, sachant que la condition est vérifiée si la chaine envoyée est bonne ;)

Un truc : utilise ! pour obtenir la négation logique d'une expression.
3
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 févr. 2009 à 22:53
if (isset($_POST['cp']) && strlen($_POST['cp']) == 5 && ctype_digit($_POST['cp'])) {
 // Code a exécuter lorsque le code postal est bon
} else {
 // Code a exécuter lorsque le code postal est mauvais
}

ou bien :

if (!(isset($_POST['cp']) && strlen($_POST['cp']) == 5 && ctype_digit($_POST['cp']))) {

 // Code a exécuter lorsque le code postal est mauvais

} else {

 // Code a exécuter lorsque le code postal est bon

}
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
4 févr. 2009 à 19:43
Salut,

Utilise le point d'exclamation ! pour exprimer la négation logique, d'ailleur j'ai mis les deux version plus haut.
3
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 16:27
j'ai réussi a limiter a 5 grâce a la fonction maxlength

mais comment faire en sorte que se soit que des chiffre qui soit accepter ?

cordialement
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 févr. 2009 à 19:07
Salut,

Pour commencer, tu es dans l'erreur si tu crois que mettre un maxlength dans le HTML va éviter quelqu'un d'envoyer quelque chose de plus long. Tu ne peux jamais te fier a ce qui est envoyé et tu devra toujours faire des vérification côté serveur, les vérification côté client n'étant pas fiables du tout. Bref, le mieux est de tester ce que tu reçoit et de faire se réafficher le formulaire en cas de mauvais remplissage.

Afin de tester côté serveur, tu peux utiliser strlen() pour vérifier la taille puis vérifier les caractères 1 par 1 fans une boucle (c'est beaucoup moins coûteux qu'une regex), un petit for par exemple. Rappel : $chaine[0] donne le premier caractère de la chaine, $chaine[1] le second, etc.
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 févr. 2009 à 21:32
@TychoBrahe :
Tu vas finir par croire que je veux te contredire à tout prix

Rien à voir bien sur, mais je me suis simplement interrogé sur les temps d'exécution des différentes propositions, et j'ai eu des surprises.
Je pensais comme toi que la regex serait plus couteuse, mais étant donné sa simplicité j'ai voulu testé.

Voici le code de test pour 1 million de contrôles (en secondes) :

$t = '78503';

for ($y=0; $y < 1000000; $y++) {
  // ma proposition :
  if (is_numeric($t)) {}; // 0.49079
 
  // avec une regex :
  if (preg_match('`^[[:digit:]]{5}$`',$t)) {}; // 2.3432
 
  // ta proposition :
  for($i=0; $i<5; $i++) { // 4.06659
    if (is_numeric($t[$i])) {};
  }
}

La regex est presque 2 fois plus rapide que ta solution ... comme quoi on a des surprises qq fois.

Bon, nous sommes d'accord, dans le cas de Lunixman toutes les solutions se valent.

Cordialement,

Kohntark-
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 févr. 2009 à 21:34
'1e4' is numeric
'9.1' is numeric
Pas forcément top sur tous les points le is_numeric() :s

Sinon dans le même genre, mais qui fonctionne mieux, tu as ctype_digit().

                
0
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 21:36
rebonjour

sinon je vient de réussir en 2 partit les voici :

if( strlen($_POST['cp']) && is_numeric)
 $erreur .="cp incorrect
";


if( strlen($_POST['cp']) <5)
 $erreur .="cp incomplet
";

en une j'ai pas réussi

vous me conseiler quel facon en sachan que se que j'ai fait et la basse de toute les autre vérification

cordialement
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 févr. 2009 à 21:41
A vrai dire, en testant char par char je pensais virer les valeurs abhérantes au passages (codes postaux impossibles), mais je me rend compte qu'en fait c'est bête vu que l'on peux comparer la valeur numérique aux deux extrêmes.

Hum, pour la regex ça me surprend énormément, je vais refaire quelques petits tests de mon côté.
0
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 21:49
TychoBrahe

je m'était mal exprimer au niveau de maxlength je voulait que la saisi du texte soi impossible de dépasser les 5 caractères et en plus après faire appelle a la vérification du coter serveur.

merci de m'avoir signaler l'erreur
0
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 21:53
au faite petite question a propos de code postal

pour les autres  pays sa a 5 chiffre aussi ?  j'espère
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 févr. 2009 à 21:55
Ha punaise oui faire char par char est extrêmement coûteux, par contre la regex met bien plus de temps qu'un ctype_digit(). Et l'écart est bien plus grand que du simple au double pour le char par char, c'est plus de l'ordre d'un facteur 10. Voici les résultats avec 10 fois plus d'itérations :

tycho@uraniborg-> time ./ctype_digit.php
real    0m5.039s
user    0m4.896s
sys     0m0.008s
tycho@uraniborg-> time ./regex.php
real    0m11.662s
user    0m11.541s
sys     0m0.012s
tycho@uraniborg-> time ./char.php
real    1m53.973s
user    1m52.951s
sys     0m0.028s
0
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 21:58
je comprend pas ton script TychoBrahe  c'est complexe
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 févr. 2009 à 22:00
Heu, je n'ai pas posté de script, le copier/collé vient de mon shell :D
0
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 22:02
ha ok  j'ai rien dit
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 févr. 2009 à 22:03
Re,

'1e4' is numeric
'9.1' is numeric
Pas forcément top sur tous les points le is_numeric() :s


Oui, je sais. Tu comptais mettre quoi dans ta boucle for ? une comparaison avec un array ?

tu as ctype_digit()
Merci, je ne connaissais pas, je regarderai de plus près mais ça parait être la meilleure solution. Elle donne 0.46852 sec au test.

quelques petits tests de mon côté
C'est qu'il ne me croit pas !!! ... dis moi quoi

Cordialement,

Kohntark -
0
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 22:05
en gros voici tout mon script

<?php




session_start();
if(@$_SESSION['session']) exit;  //Si la personne est identifiée, on lui interdit l'accès à la page d'inscription


include_once 'recup_config.php'; //On récupère la configuration du script
$titre_page = INSCRIPTION_TITRE;   //Définition du titre de la page
include_once 'haut.php';   //on affiche le haut (header)


if( isset($_POST['envoi']) ) {


require_once 'fonctions/formulaires.php';


$_POST = form_secu($_POST, 'addslashes');
$_POST = form_secu($_POST, 'htmlchars');
$_POST = form_secu($_POST, 'trim');


//// VERIFICATIONS BANALES ////
if( strlen($_POST['mdp']) < 5)
 $erreur .=INSCRIPTION_ERREUR_PASS_PETIT ."
";


if($_POST['mdp'] !== $_POST['mdp2'])
 $erreur .=INSCRIPTION_ERREUR_PASS_IDENTIQUE ."
";


if( strlen($_POST['pseudo']) > 15 || strlen($_POST['pseudo']) < 3)
 $erreur .=INSCRIPTION_ERREUR_PASS_TAILLE ."
";
 
if( strlen($_POST['email']) < 1)
 $erreur .=INSCRIPTION_PAS_DE_EMAIL ."
";


if( strlen($_POST['cp']) && is_numeric)
 $erreur .="cp incorect
";


if( strlen($_POST['cp']) <5)
 $erreur .="cp incomplet
";


 


 




 
if( strlen($erreur) > 5 ) {
 echo $erreur ,'[# ', GENERAL_RETOUR, ']';
 include_once 'bas.php';
 exit;
 }
 connexion();
//// VERIFICATIONS DES EXISTANCES ////
$reponse_mail = @mysql_query("SELECT email FROM ". PREFIX ."membres WHERE email='". $_POST['email'] ."'") or die ('Erreur de vérification d\'e-mail déjà existant'); //verification si e-mail existe déjà
$count_mail = @mysql_num_rows($reponse_mail);
if($count_mail === 1)
 $erreur .=INSCRIPTION_DEJA_EMAIL ."
";


$reponse_pseudo=mysql_query("SELECT pseudo FROM ". PREFIX ."membres WHERE pseudo='". $_POST['pseudo'] ."'") or die ('Erreur de vérification du pseudo déjà existant'); //verification si pseudo existe déjà
$count_pseudo=mysql_num_rows($reponse_pseudo);
if($count_pseudo === 1)
 $erreur .=INSCRIPTION_DEJA_PSEUDO ."
";
 
if( strlen($erreur) > 5 ) {
 echo $erreur ,'[# ', GENERAL_RETOUR, ']';
 include_once 'bas.php';
 exit;
 }


$alea = id_aleatoire(); //Création d'un identifiant aléatoire
 
$passe = md5($_POST['mdp']); //Encodage en md5 (c'est pas le plus sécurisé possible)


if($environement_site 1 AND $validation_site 1) $validation_site = 3;  //Si on est en local, ca revient à ce qu'il n'y ai aucune validation par mail.
$validation = 0;if($validation_site 3) $validation 1;
 
mysql_query("INSERT INTO ". PREFIX ."membres VALUES ('', '". $alea ."', '". $_POST['pseudo'] ."', '". $_POST['nom'] ."', '". $_POST['prenom'] ."', '". $_POST['adresse'] ."', '". $_POST['cp'] ."', '". $_POST['ville'] ."', '". $_POST['pays'] ."', '". $passe ."', '". $_POST['email'] ."', ". $validation .", ". MEMBRE .") ") or die ('Erreur d\'insertion dans la base de données');


if($validation_site == 1)
 echo'', INSCRIPTION_MESSAGE_FIN, $nom_site ,'.

 ', INSCRIPTION_MESSAGE_FIN_VALIDATION_1, ' [index.php ', GENERAL_RETOUR, ']';


if($validation_site == 2)
 echo'', INSCRIPTION_MESSAGE_FIN, $nom_site ,'.

 ', INSCRIPTION_MESSAGE_FIN_VALIDATION_2, ' [index.php ', GENERAL_RETOUR, ']';


if($validation_site == 3)
 echo'', INSCRIPTION_MESSAGE_FIN, $nom_site ,'.

 ', INSCRIPTION_MESSAGE_FIN_VALIDATION_3, ' [index.php ', GENERAL_RETOUR, ']';


if($environement_site == 2)
 {
 if($validation_site == 1)
  mail($_POST['email'], '['. $nom_site .']'.INSCRIPTION_TITRE, INSCRIPTION_MAIL_PARTIE_1. $nom_site .".
". INSCRIPTION_MAIL_PARTIE_2 ."
". INSCRIPTION_PSEUDO ." : ". $_POST['pseudo'] ."
". INSCRIPTION_PASS ." : ". $_POST['mdp'] ."


". INSCRIPTION_MAIL_VALIDATION_1 ."
". $adresse_site ."validation_mail.php?id=". $alea ."


________________________
". INSCRIPTION_MAIL_FORMULES ."
". $nom_site, "From: ". $nom_site ."<robot@". $nom_site .">");
   if($validation_site 3 OR $validation_site 2)
  mail($_POST['email'], '['. $nom_site .']'.INSCRIPTION_TITRE, INSCRIPTION_MAIL_PARTIE_1. $nom_site .".
". INSCRIPTION_MAIL_PARTIE_2 ."
". INSCRIPTION_PSEUDO ." : ". $_POST['pseudo'] ."
". INSCRIPTION_PASS ." : ". $_POST['mdp'] ."


________________________
". INSCRIPTION_MAIL_FORMULES ."
". $nom_site, "From: ". $nom_site ."<robot@". $nom_site .">");
 }
 
} else {
?>

<?php echo INSCRIPTION_TITRE; ?>

<form method="post" action="">
  ----

 <label for="pseudo"><?php echo INSCRIPTION_PSEUDO; ?></label>,
 ,
 
 ----

 <label for="email"><?php echo INSCRIPTION_EMAIL; ?></label>,
 ,
 
 ----

 <label for="mdp"><?php echo INSCRIPTION_PASS; ?></label>,
 ,
 
 ----

 <label for="mdp2"><?php echo INSCRIPTION_CONFIRM_PASS; ?></label>,
 ,

 
 ----

 <label for="nom"><?php echo Nom; ?></label>,
 ,
 
 ----

 <label for="prenom"><?php echo Prénom; ?></label>,
 ,
 
 ----

 <label for="adresse"><?php echo Adresse; ?></label>,
 ,
 
 ----

 <label for="cp"><?php echo 'Code Postal'; ?></label>,
 ,
 
 ----

 <label for="ville"><?php echo Ville; ?></label>,
 ,
 
 ----

 <label for="pays"><?php echo Pays; ?></label>,
 ,
 
 ----

 " name="envoi" />,
 
 

 </form>

 [index.php <?php echo GENERAL_RETOUR; ?>]

<?php
 }
include_once 'bas.php'; //on affiche le bas (footer)
?>

pouvais vous me dire se que vous en pensait et coment je pourait verifier les émails (a moins que je dois recrer un sujet pour sa )

cordialement
0
cs_lunixman Messages postés 41 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 10 février 2009
3 févr. 2009 à 22:10
je viens de refaire des tests

if( strlen($_POST['cp']) && is_numeric)
 $erreur .="cp incorect
";

ne marche pas que se soit des chiffre ou des lettres sa met l'erreur
0