Une fonction utilisateur qui pose problème.
Résolu/Fermé
trevino
-
3 sept. 2017 à 16:20
jordane45 Messages postés 38288 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 novembre 2024 - 4 sept. 2017 à 20:06
jordane45 Messages postés 38288 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 15 novembre 2024 - 4 sept. 2017 à 20:06
A voir également:
- Une fonction utilisateur qui pose problème.
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Rechercher utilisateur leboncoin - Forum Réseaux sociaux
- Excel renvoyer la valeur d'une cellule en fonction d'une autre - Forum Logiciels
- Cette fonction n'est pas disponible actuellement tv lg - Forum Téléviseurs
3 réponses
yg_be
Messages postés
23327
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 novembre 2024
Ambassadeur
1 551
Modifié le 3 sept. 2017 à 16:33
Modifié le 3 sept. 2017 à 16:33
bonjour,
je te suggère d'utiliser TRUE et FALSE au lieu de 1 et 0.
je te suggère aussi d'ajouter des
quelle est la fonction qui ne se comporte pas comme tu t'y attends?
pour cette fonction, que passes-tu précisément comme paramètre, qu'attends-tu comme résultat?
je te suggère d'utiliser TRUE et FALSE au lieu de 1 et 0.
je te suggère aussi d'ajouter des
echopour afficher ce que ton code fait et que contiennent tes variables.
quelle est la fonction qui ne se comporte pas comme tu t'y attends?
pour cette fonction, que passes-tu précisément comme paramètre, qu'attends-tu comme résultat?
jordane45
Messages postés
38288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 novembre 2024
4 703
3 sept. 2017 à 22:36
3 sept. 2017 à 22:36
Bonjour,
pour commencer.. la fonction htmlspecialchar n'est à utiliser QUE pour l'affichage.
En aucun cas pour récupérer les données ...
Ensuite, regarde la priorité des opérateurs (https://www.php.net/manual/fr/language.operators.precedence.php )
Perso.. je préfère le && au lieu du AND
Puis, pour ce qui est de l'écriture de ton code... tu pourrais un peu plus utiliser l'écriture ternaire au lieude faire des IF / ELSE
Par exemple, ce code :
peut s'écrire plus "proprement" comme ceci :
voir même dans ce cas précis :
NB : Pour ce qui est de la récupération des données ainsi que ton premier IF .. je te conseille de remplacer ceci :
par :
NB² : Même si ce n'est pas une obligation... il existe une norme pour écrire son code. La norme PSR.
En l'occurence... elle propose d'écrire les IF (et if/else.. ) de la manière suivante (avec l'accolade sur la même ligne...) :
cela rendra ton code plus lisible .....
Pour finir, en ce qui concerne la "logique" de ton code...
Je commencerai par vérifier si le user et/ou l'email est déjà utilisé avant d'aller regarder si il est "valide".
pour commencer.. la fonction htmlspecialchar n'est à utiliser QUE pour l'affichage.
En aucun cas pour récupérer les données ...
Ensuite, regarde la priorité des opérateurs (https://www.php.net/manual/fr/language.operators.precedence.php )
Perso.. je préfère le && au lieu du AND
Puis, pour ce qui est de l'écriture de ton code... tu pourrais un peu plus utiliser l'écriture ternaire au lieude faire des IF / ELSE
Par exemple, ce code :
function allowed_chars($str) { if(preg_match('#^[a-zA-Z0-9._\[\]\|\$\!@=\+&-]$#',$str)) // Caractères spéciaux autorisés : ._[]|$!@=+&- { return 1; } else { return 0; } }
peut s'écrire plus "proprement" comme ceci :
function allowed_chars($str) { return preg_match('#^[a-zA-Z0-9._\[\]\|\$\!@=\+&-]$#',$str) ? true : false; }
voir même dans ce cas précis :
function allowed_chars($str) { return preg_match('#^[a-zA-Z0-9._\[\]\|\$\!@=\+&-]$#',$str); }
NB : Pour ce qui est de la récupération des données ainsi que ton premier IF .. je te conseille de remplacer ceci :
$username=htmlspecialchars($_POST['username']); $user_email=htmlspecialchars($_POST['mail1']); $user_email_confirm=htmlspecialchars($_POST['mail2']); $user_password=$_POST['password1']; $user_password_confirm=$_POST['password2']; $error_message=""; if(!empty($username) AND !empty($user_email) AND !empty($user_email_confirm) AND !empty($user_password) AND !empty($user_password_confirm)) {
par :
//récupération PROPRE des variables $username = !empty($_POST['username']) ? $_POST['username'] : NULL; $user_email = !empty($_POST['mail1']) ? $_POST['mail1'] : NULL; $user_email_confirm = !empty($_POST['mail2']) ? $_POST['mail2'] : NULL; $user_password = !empty($_POST['password1']) ? $_POST['password1'] : NULL; $user_password_confirm = !empty($_POST['password2']) ? $_POST['password2'] : NULL; //ici tu peux aussi ajouter (le temps des tests) un print de $_POST pour voir si ce qu'il retourne est conforme à ce que tu attends echo "<pre> Variables POST :<br>"; print_r($_POST); echo "</pre>"; //autre variable $error_message=""; //IF ... if($username && $user_email && $user_email_confirm && $user_password && $user_password_confirm){
NB² : Même si ce n'est pas une obligation... il existe une norme pour écrire son code. La norme PSR.
En l'occurence... elle propose d'écrire les IF (et if/else.. ) de la manière suivante (avec l'accolade sur la même ligne...) :
if(condition) { //... } elseif(condtion) { //... } else { //... }
cela rendra ton code plus lisible .....
Pour finir, en ce qui concerne la "logique" de ton code...
Je commencerai par vérifier si le user et/ou l'email est déjà utilisé avant d'aller regarder si il est "valide".
Merci à tous :)
Jordane : j'ai appliqué tes recommandations (en particulier l'écriture ternaire, au moins pour la récupération des variables).
yg_be : j'ai pris soin de corriger la regex. Je voulais qu'elle accepte une chaîne de caractère de longueur comprise entre 6 et 32 caractères (intervalle fermé). La chaîne de caractère pouvait contenir les lettres de A à Z (insensible à la casse, puisque j'ai inclus les deux classes [a-z] et [A-Z]), les chiffres de 0 à 9, et les caractères spéciaux suivants : ._[]|$!@=+&-
Le problème, c'est qu'en faisant ainsi, je n'indiquais pas la longueur. J'ai donc fait une fonction qui répondait à toutes mes exigences en fusionnant allowed_chars() et valid_username(). À la fin, voici ce que j'obtiens :
Plus claire, plus concise, cette fonction fait son job :)
Maintenant, ma page d'inscription fonctionne correctement, c'est tout ce que je voulais.
Pour finir, j'aimerais savoir Jordane pourquoi tester si l'username est déjà pris avant de voir s'il est valide ?
Jordane : j'ai appliqué tes recommandations (en particulier l'écriture ternaire, au moins pour la récupération des variables).
yg_be : j'ai pris soin de corriger la regex. Je voulais qu'elle accepte une chaîne de caractère de longueur comprise entre 6 et 32 caractères (intervalle fermé). La chaîne de caractère pouvait contenir les lettres de A à Z (insensible à la casse, puisque j'ai inclus les deux classes [a-z] et [A-Z]), les chiffres de 0 à 9, et les caractères spéciaux suivants : ._[]|$!@=+&-
Le problème, c'est qu'en faisant ainsi, je n'indiquais pas la longueur. J'ai donc fait une fonction qui répondait à toutes mes exigences en fusionnant allowed_chars() et valid_username(). À la fin, voici ce que j'obtiens :
function allowed_username($str) { return preg_match('#^[a-zA-Z0-9._\[\]\|\$\!@=\+&-]{6,32}$#',$str); // Caractères spéciaux autorisés : ._[]|$!@=+&- }
Plus claire, plus concise, cette fonction fait son job :)
Maintenant, ma page d'inscription fonctionne correctement, c'est tout ce que je voulais.
Pour finir, j'aimerais savoir Jordane pourquoi tester si l'username est déjà pris avant de voir s'il est valide ?
jordane45
Messages postés
38288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 novembre 2024
4 703
4 sept. 2017 à 20:06
4 sept. 2017 à 20:06
Pour eviter une etape inutile.. si il est deja pris tu te moques de savoir si il est valide... puisque..ben...il est déjà pris...
3 sept. 2017 à 16:46
-> Où devrais-je mettre les ?
-> La fonction qui me pose problème est la fonction valid_username. Elle prend en paramètre une chaîne de caractère, et se charge de vérifier 2 caractéristiques : si sa longueur est comprise entre 5 et 33 caractères, et si les caractères utilisés sont validés par la regex.
3 sept. 2017 à 17:22
tu n'as pas répondu: quelle est la valeur de $username quand tu appelles la fonction valid_username, et qu'attends-tu comme réponse: 0 ou 1?
tu peux ajouter des echo aussi avant chaque return, par exemple:
cela t'aidera à comprendre à quel moment ton code ne fait pas ce que tu crois avoir demandé.
tu peux aussi faire, par exemple:
, pour vérifier si tu as bien codé la fonction preg_match.
3 sept. 2017 à 17:33