Formulaire special

[Résolu]
Signaler
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009
-
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009
-
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

Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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-
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
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.
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
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

}
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
Salut,

Utilise le point d'exclamation ! pour exprimer la négation logique, d'ailleur j'ai mis les deux version plus haut.
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

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
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
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.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
@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-
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
'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().
                        
                
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

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
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
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é.
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

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
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

au faite petite question a propos de code postal

pour les autres  pays sa a 5 chiffre aussi ?  j'espère
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
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
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

je comprend pas ton script TychoBrahe  c'est complexe
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
Heu, je n'ai pas posté de script, le copier/collé vient de mon shell :D
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

ha ok  j'ai rien dit
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

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
Messages postés
41
Date d'inscription
lundi 12 janvier 2009
Statut
Membre
Dernière intervention
10 février 2009

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