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 :

Recherche "LIKE" et sensibilité à la casse [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études

    Informations forums :
    Inscription : Mars 2002
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Recherche "LIKE" et sensibilité à la casse
    Bonjour,

    Je me résous à poster mon problème ici car après de multiples recherches sur le net depuis plusieurs jours, je n'ai toujours pas trouvé de de solution.

    Soit une table avec plusieurs champs. Via un formulaire, un internaute saisi un terme pour effectuer une recherche sur cette table et ces différents champs. Ci-dessous la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $db_query = sprintf("SELECT * FROM `matable` WHERE CONCAT_WS(champ1,champ2,champ3,champ4,champ5) LIKE '%s' ORDER BY `champ1` ASC", mysql_real_escape_string('%'.$recherche.'%', $db_connect));
    $db_result = mysql_query($db_query, $db_connect) OR die (mysql_error());
    Le problème est le suivant : la recherche est sensible à la casse alors qu'elle ne le devrait pas (et c'est ce que je recherche, qu'elle ne soit pas sensible à la casse). Quand je saisi "Lapin", cela ne me retourne pas "lapin"...

    Tous les interclassements sont en utf8_general_ci et mon site en UTF8. Les champs sont de type "tinytext" (ils étaient en varchar(255) au départ).

    En local chez moi avec WampServer, cela marche très bien, mais plus chez mon hébergeur (MavenHosting). Si quelqu'un voit d'où le problème peut venir...

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Normalement la sensibilité à la casse vient de l'interclassement.

    Tu es sur qu'il est bien en _ci ?
    Chaque champ possède son propre interclassement.
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études

    Informations forums :
    Inscription : Mars 2002
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Oui j'ai bien vérifié, tout est en _ci, y compris les champs. J'ai fait le test sur un hébergement Infomaniak et le pb est le même..

    ++

  4. #4
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Bonjour,
    Faut mettre un double pourcentage "%%" à la place de "%"

    ou strtoupper pour mettre la recherche tout en majuscules

    Cordialement
    If you type Google into Google, you Can break the internet" - The IT Crowd

  5. #5
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Il y a déjà %%
    %s c'est ce que va utiliser le sprintf.

    Tu peux mettre un echo pour voir ce que ta requête donne exactement ?
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  6. #6
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études

    Informations forums :
    Inscription : Mars 2002
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    J'ai déjà fait un echo sur la requête et elle marche très bien. J'ai bien le mot recherché du type " LIKE '%Lapin%' " (cf. ci-dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `matable` WHERE CONCAT_WS(champ1,champ2,champ3,champ4,champ5) LIKE '%Lapin%' ORDER BY `champ1` ASC
    Merci pour ton aide.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études

    Informations forums :
    Inscription : Mars 2002
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    ou strtoupper pour mettre la recherche tout en majuscules
    J'y ai bien pensé, mais comme dans la base, les mots ne sont pas en majuscule, le pb reste le même.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études

    Informations forums :
    Inscription : Mars 2002
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Je viens de faire un test intéressant : si je fait la recherche uniquement sur un champ (sans l'utilisation de CONCAT_WS), je n'ai plus ce problème de sensibilité à la casse... Cela viendrait donc de l'utilisation de CONCAT_WS.

  9. #9
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Re:
    Oui, mais si tu transforme ta recherche et la valeur que tu recherche en base de donnée, tu obtient le meme resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT LOWER(CONCAT_WS(' ','lapin','Lapin', 'LAPIN')) AS chaine 
    WHERE chaine LIKE LOWER('%Lapin%')
    If you type Google into Google, you Can break the internet" - The IT Crowd

  10. #10
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études

    Informations forums :
    Inscription : Mars 2002
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    Re:
    Oui, mais si tu transforme ta recherche et la valeur que tu recherche en base de donnée, tu obtient le meme resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT LOWER(CONCAT_WS(' ','lapin','Lapin', 'LAPIN')) AS chaine 
    WHERE chaine LIKE LOWER('%Lapin%')
    J'ai testé avec la requête suivante et dans ce cas là, je n'ai plus aucun résultat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `matable` WHERE UCASE(CONCAT_WS('/',champ1,champ2,champ3,champ4,champ5)) LIKE UCASE('%s') ORDER BY `champ1` ASC

  11. #11
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études

    Informations forums :
    Inscription : Mars 2002
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    J'ai (enfin) trouvé ! En cherchant sur des forums anglophones, j'ai trouvé la réponse : visiblement, l'utilisation de CONCAT_WS semble convertir les données en binaire (type BLOB), ce qui les rend sensible à la casse. La requête suivante permet de contourner le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `matable` WHERE CONVERT(CONCAT_WS('/',champ1,champ2,champ3,champ4,champ5) USING UTF8) LIKE '%s' ORDER BY `champ1` ASC
    Et effectivement, cela marche !

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

Discussions similaires

  1. Sensibilité à la casse - commande LIKE
    Par loris dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/02/2007, 22h05

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