Lettre en Min et Maj

Mammouth du PHP | 725 Messages

18 févr. 2012, 06:57

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

ViPHP
xTG
ViPHP | 7331 Messages

18 févr. 2012, 09:44

Sous MySQL tu as la fonction tolower() que tu peux utiliser ainsi :
SELECT id FROM maTable WHERE tolower(champs) = tolower(?)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 févr. 2012, 11:21

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 725 Messages

18 févr. 2012, 13:56

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 (=)

ViPHP
xTG
ViPHP | 7331 Messages

18 févr. 2012, 14:22

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. :P

Mammouth du PHP | 2278 Messages

18 févr. 2012, 23:18

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?
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 725 Messages

19 févr. 2012, 10:56

SELECT pseudo FROM membres WHERE pseudo LIKE 'admin'
est ce que cette requete est securisee?

ViPHP
xTG
ViPHP | 7331 Messages

19 févr. 2012, 11:38

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.

Mammouth du PHP | 725 Messages

19 févr. 2012, 14:36

c'est pour un formulaire d'enregistrement, on verifie si le pseudo est disponible ou non

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 févr. 2012, 17:54

dans ce cas utilise l'égalité, a la limite tu passe les deux en majuscule ou minuscule mais surtout pas de like ;)


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

20 févr. 2012, 04:38

comme ca:
$username = strtolower($_POST['username']);

$sqlq = 'SELECT LOWER(pseudo) FROM membres WHERE pseudo = \''.$username.'\'';

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 07:44

Plutôt ainsi :
$username = strtolower(mysql_real_escape_string($_POST['username']));
$sqlq = "SELECT LOWER(pseudo) FROM membres WHERE lower(pseudo) = '$username'";

Mammouth du PHP | 725 Messages

20 févr. 2012, 10:07

ah merci je dois l'ajouter sur les 2 le SELECT et WHERE, merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 févr. 2012, 22:58

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 725 Messages

21 févr. 2012, 07:01

SELECT COUNT(*) marche avec la PDO?