Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/01/2012, 18h20   #1
Invité régulier
 
Homme
Inscription : mars 2002
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2002
Messages : 15
Points : 5
Points : 5
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 :
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.
Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 23h43   #2
Membre Expert
 
Avatar de Seb33300
 
Homme Sébastien Alfaiate
Développeur Web
Inscription : janvier 2007
Messages : 1 330
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Alfaiate
Âge : 26
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : janvier 2007
Messages : 1 330
Points : 1 659
Points : 1 659
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 Engineer PHP 5.3

« 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
Seb33300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 09h56   #3
Invité régulier
 
Homme
Inscription : mars 2002
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2002
Messages : 15
Points : 5
Points : 5
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..

++
Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 10h16   #4
Membre expérimenté
 
Avatar de buggen25
 
Inscription : août 2008
Messages : 510
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 510
Points : 595
Points : 595
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
buggen25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 12h48   #5
Membre Expert
 
Avatar de Seb33300
 
Homme Sébastien Alfaiate
Développeur Web
Inscription : janvier 2007
Messages : 1 330
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Alfaiate
Âge : 26
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : janvier 2007
Messages : 1 330
Points : 1 659
Points : 1 659
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 Engineer PHP 5.3

« 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
Seb33300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 13h27   #6
Invité régulier
 
Homme
Inscription : mars 2002
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2002
Messages : 15
Points : 5
Points : 5
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 :
SELECT * FROM `matable` WHERE CONCAT_WS(champ1,champ2,champ3,champ4,champ5) LIKE '%Lapin%' ORDER BY `champ1` ASC
Merci pour ton aide.
Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 13h41   #7
Invité régulier
 
Homme
Inscription : mars 2002
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2002
Messages : 15
Points : 5
Points : 5
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.
Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 13h45   #8
Invité régulier
 
Homme
Inscription : mars 2002
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2002
Messages : 15
Points : 5
Points : 5
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.
Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 14h09   #9
Membre expérimenté
 
Avatar de buggen25
 
Inscription : août 2008
Messages : 510
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 510
Points : 595
Points : 595
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 :
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
buggen25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 14h55   #10
Invité régulier
 
Homme
Inscription : mars 2002
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2002
Messages : 15
Points : 5
Points : 5
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 :
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 :
SELECT * FROM `matable` WHERE UCASE(CONCAT_WS('/',champ1,champ2,champ3,champ4,champ5)) LIKE UCASE('%s') ORDER BY `champ1` ASC
Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 15h22   #11
Invité régulier
 
Homme
Inscription : mars 2002
Messages : 15
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2002
Messages : 15
Points : 5
Points : 5
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 :
SELECT * FROM `matable` WHERE CONVERT(CONCAT_WS('/',champ1,champ2,champ3,champ4,champ5) USING UTF8) LIKE '%s' ORDER BY `champ1` ASC
Et effectivement, cela marche !
Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h16.


 
 
 
 
Partenaires

Hébergement Web