IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Utilisation de COLLATE dans une requète préparée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut Utilisation de COLLATE dans une requète préparée
    Bonjour,
    j'essaie de créer un espace membre. Je voudrais que lorsque la personne entre ses identifiants dans le formulaire d'ouverture de session, PSEUDO et pseudo ne soient pas équivalent. En clair, je voudrais qu'il y ait une distinction entre les minuscules et les majuscules mais je n'y parviens pas.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $req = $bdd->prepare('SELECT pseudo, pass FROM adherent WHERE pseudo = :pseudo collate French_CS_AS AND pass = :pass');
    	$req->execute(array(
    	':pseudo' => $_POST['pseudo'],
    	':pass' => $pass));
    Merci!!!!

  2. #2
    Membre habitué Avatar de Savak
    Homme Profil pro
    Ingénieur Etude et Développement
    Inscrit en
    Avril 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Etude et Développement

    Informations forums :
    Inscription : Avril 2012
    Messages : 111
    Points : 192
    Points
    192
    Par défaut
    Bonjour!

    A mon avis, tu devrais jeter un coup d’œil à cette fonction php : strnatcmp()

    Cette méthode native de php permet de comparer deux chaines de caractères et est sensible à la casse.

    Bon courage!

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est la colonne qui change d'interclassement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pseudo, pass FROM adherent WHERE pseudo collate French_CS_AS = :pseudo  AND pass = :pass
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Merci Sabotage, mais j'ai essayé ton code et ca me fait la mm chose qu'avant, j'obtiens mon message d'erreur comme quoi mon mot de passe ou mon pseudo n'est pas valide. Lorsque je n'utilise pas le collate, j'arrive à me connecter mais sans prendre en compte les majuscules et les minuscules.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    French_CS_AS est un interclassement SQL Server et non Mysql ; tu utilises quel SGDB ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Je suis sur PhpMyAdmin.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Donc Mysql.
    Si ta colonne a un interclassement UTF8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pseudo, pass FROM adherent WHERE pseudo = COLLATE UTF8_bin :pseudo AND pass = :pass
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Merci, mais ca ne change toujours rien, lorsque je valide mon formulaire, il renvoie toujours pseudo ou mot de passe non valide.
    C'est peut être une erreur de guillemets ou un truc dans le genre non?

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu ne nous as pas montré le code donc c'est difficile de te répondre.

    Tu as contrôlé que la requête fonctionnait au moins ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Voici tout le code, oui la requête fonctionne parfaitement, juste elle ne fait aucune distinction entre les majuscules et les minuscules.
    Je peux donc aussi bien m'identifier avec un Sophie qu'avec un SOPHIE ou encore un SoPhIe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    // On vérifie que le formulaire vient d'être envoié.
    if (isset($_POST['valider'])) {
     
    // On regarde si nos variables ne sont pas vides.
    if ((!empty($_POST['pseudo'])) && (!empty($_POST['pass']))) {
     
    	// On hache le mot de passe.
    	$pass_hache = sha1('gz' . $_POST['pass']);
     
    	// On vérifie que le pseudo et le mot de passe sont valides dans la base de données avant d'ouvrir une session.
    	$req = $bdd->prepare('SELECT pseudo, pass FROM adherent WHERE pseudo = :pseudo AND pass = :pass');
    	$req->execute(array(
    	':pseudo' => $_POST['pseudo'],
    	':pass' => $pass_hache));
     
    	$resultat = $req->fetch();
    	$req->closeCursor();
     
    	if (!$resultat) {
    	echo"<script>alert('Pseudo ou mot de passe non valide');</script>";
    	}
    	else {
    	$_SESSION['pseudo'] = $_POST['pseudo'];
     
    	//Redirection.
    	header('Location: ../html/accueil.php');
    	}
    }
    else {
    echo"<script>alert('Veuiller remplir tous les champs svp');</script>";
    }
    }
    ?>

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quand je te demandais si tu avais testé la requête, je parlais de celle avec le changement de collation.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Oui j'ai testé avant le changement et aussi après.
    Avant de mettre le collate, il reconnaît l'adhérent.
    Après le collate, il ne le reconnaît plus dutout.

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non mais je parle de tester la requête seule dans phpmyadmin, pas le code PHP.
    D'apres tout ce que tu nous décris, tu n'as pas activé les erreurs PDO, donc tu ne sais même pas si l'interclassement que tu demandes est conforme.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Aaaaah, pardon, je n'avais pas compris l'histoire des interclassements. Pour le moment je suis en latin1_swedish_c dans ma bdd pour mon pseudo (je t'avoue je ne sais pas dutout à quoi ça correspond!).
    J'ai regardé effectivement y a pas mal de choix possible y compris dans les utf8. Il faut que je choisisse lequel? utf8_bin?

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ton site est encodé en UTF8 ou en ISO ?

    Tu veux pouvoir avoir "toto" et "TOTO" comme login différents ou tu veux juste que l'utilisateur "TotO" ne puisse pas se connecter en mettant "toto" ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Mon site est en utf8.
    Je veux que toto puisse se connecter mais pas Toto ou encore ToTo ......
    Je veux donc une sensibilité à la casse.

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Met alors simplement l'interclassement UTF8_bin sur cette colonne et fais un SELECT sans COLLATE.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup pour ta patience!!!!!! Ca fonctionne à merveille comme ca.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23
  2. [SQL] Utilisation de variables dans une requête SQL
    Par heteroclite dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/09/2006, 22h38
  3. utiliser un controle dans une Requête
    Par issam16 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 21/06/2006, 11h06
  4. Réponses: 4
    Dernier message: 16/02/2006, 16h28
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo