kohntark
Messages postés3706Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 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)
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 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.
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 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
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 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.
kohntark
Messages postés3706Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 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.
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 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é.
cs_lunixman
Messages postés41Date d'inscriptionlundi 12 janvier 2009StatutMembreDernière intervention10 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.
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 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
kohntark
Messages postés3706Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 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
cs_lunixman
Messages postés41Date d'inscriptionlundi 12 janvier 2009StatutMembreDernière intervention10 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( 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 ."
";
$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');