Page 1 sur 2
Lettre en Min et Maj
Posté : 18 févr. 2012, 06:57
par rimie
Bonjour,
J'ai une table membres, dont je veux verifier un pseudo si'il existe ou non:
CRATE TABLE membres
id
pseudo
VALUES (1, 'Admin');
le pseudo Admin peut etre enregistre encore une fois par admin, AdMin,...
et ma requete est:
$username = $_POST['username'];
$sqlq = 'SELECT pseudo FROM membres WHERE pseudo = "'.$username.'"';
// => resultat
//SELECT pseudo FROM membres WHERE pseudo = "admin"
la reponse serait que cet utilisateur n'existe pas, comment inserer mes donnees comme elles sont saisis par l utilisateur, mais au mement de verification de la disponibilite, le mot 'admin' devait s'afficher comme NON DISPONIBLE, quoi que ce soit la facon de son ecriture.
merci
Re: Lettre en Min et Maj
Posté : 18 févr. 2012, 09:44
par xTG
Sous MySQL tu as la fonction
tolower() que tu peux utiliser ainsi :
SELECT id FROM maTable WHERE tolower(champs) = tolower(?)
Re: Lettre en Min et Maj
Posté : 18 févr. 2012, 11:21
par Ryle
C'est UPPER() / LOWER() en SQL

(et strToUpper() / strToLower() en php

)
Pour des questions de performances, il peut être intéressant de passer la chaine à tester en minuscule (ou majuscule) avec php (exécuté une seule fois lors de la génération de la requête), plutôt que de demander à la base de l'effectuer à chaque comparaison. Je ne sais pas si MySQL met en cache le résultat, mais comme ce n'est pas le cas de toutes les bases, ça optimise le traitement

Re: Lettre en Min et Maj
Posté : 18 févr. 2012, 13:56
par rimie
j'ai teste celle ci, mais quelque chose qui va pas, je vais reprendre:
http://stackoverflow.com/questions/2217 ... -lowercase
je pense aussi utiliser LIKE, mais j'aime bien mettre (=)
Re: Lettre en Min et Maj
Posté : 18 févr. 2012, 14:22
par xTG
LIKE c'est totalement différent de l'égalité j'espère que tu en es conscient...
Sinon pour le "quelque chose ne va pas" on n'a pas encore reçu notre commande de boule de cristal.

Re: Lettre en Min et Maj
Posté : 18 févr. 2012, 23:18
par sirakawa
Ben oui, la première chose est de mieux contrôler la création:
pseudo tout transformé en minuscules, en majuscules, première lettre seulement en majuscules... comme suggéré ci-dessus. En écrivant. ta fonction sur mesure, ce qui fait que si tu changes de politique, tu auras à modifier seulement ta fonction et à mettre à jour ta BDD.
Dès lors, il suffit de transformer le login saisi avec la même fonction pour avoir la paix.
Si tu joues avec like pour vérifier les login, tu risques de ne pas reconnaître un login mal majusculé et de reconnaître un stock de balivernes.... D'ailleurs "admin c'est like quoi?
Re: Lettre en Min et Maj
Posté : 19 févr. 2012, 10:56
par rimie
SELECT pseudo FROM membres WHERE pseudo LIKE 'admin'
est ce que cette requete est securisee?
Re: Lettre en Min et Maj
Posté : 19 févr. 2012, 11:38
par xTG
Non, le LIKE n'a aucun intérêt sauf pour un formulaire de recherche dans ce cas précis.
Faire un LIKE pour un formulaire de connexion (si c'est ton cas) est une énorme faille de sécurité car cela veut dire qu'on pourrait se connecter sans connaitre exactement le login.
Re: Lettre en Min et Maj
Posté : 19 févr. 2012, 14:36
par rimie
c'est pour un formulaire d'enregistrement, on verifie si le pseudo est disponible ou non
Re: Lettre en Min et Maj
Posté : 19 févr. 2012, 17:54
par moogli
dans ce cas utilise l'égalité, a la limite tu passe les deux en majuscule ou minuscule mais surtout pas de like
@+
Re: Lettre en Min et Maj
Posté : 20 févr. 2012, 04:38
par rimie
comme ca:
$username = strtolower($_POST['username']);
$sqlq = 'SELECT LOWER(pseudo) FROM membres WHERE pseudo = \''.$username.'\'';
Re: Lettre en Min et Maj
Posté : 20 févr. 2012, 07:44
par xTG
Plutôt ainsi :
$username = strtolower(mysql_real_escape_string($_POST['username']));
$sqlq = "SELECT LOWER(pseudo) FROM membres WHERE lower(pseudo) = '$username'";
Re: Lettre en Min et Maj
Posté : 20 févr. 2012, 10:07
par rimie
ah merci je dois l'ajouter sur les 2 le SELECT et WHERE, merci
Re: Lettre en Min et Maj
Posté : 20 févr. 2012, 22:58
par Ryle
Ben sur le WHERE c'est indispensable puisque c'est la chaine que tu as en base que tu vas comparer à celle que tu récupères de ton formulaire. Il vaut donc mieux que les deux soient en minuscules
Pour le select, c'est le résultat de ta requête. La question est donc de savoir si tu as besoin de récupérer un pseudo en minuscule (avec lower()) ou dans la forme dans laquelle il se trouve dans ta base (sans lower()).
A noter également que si la seule chose qui t'intéresse c'est de tester l'existence du pseudo, tu peux faire un " SELECT COUNT(*) " plutôt qu'un " SELECT pseudo ", le premier te retournant juste le nombre de résultat trouvé ( 0 = pseudo disponible ; 1 ou plus = pseudo déjà utilisé ). Le count() est la fonction la plus rapide et la plus optimisée en sql

Re: Lettre en Min et Maj
Posté : 21 févr. 2012, 07:01
par rimie
SELECT COUNT(*) marche avec la PDO?