Recherche [SQL] non sensible à la casse
Résolu
NickoX9
Messages postés
47
Date d'inscription
Statut
Membre
Dernière intervention
-
Kzr -
Kzr -
Bonjour,
Voilà, je tente de faire une requête qui permet de faire une recherche sur l'ensemble de ma base de données Mysql...
Ma requête est de type :
SELECT * FROM ma_table WHERE `champ_1` LIKE %recherche% OR `champ_2` LIKE %recherche%..etc
-------------------------------------------------------------------------------------------------
Le problème est qu'avec ce type de requête, la casse n'est pas prise en compte... Si je tape ballon ou Ballonou encore BALLON je n'aurais pas le même résultat...
Je fais donc appel à vos services afin de trouver une solution à ce problème c'est à dire : pouvoir faire une requête de recherche (cf. ci dessus) dans la base de données qui ne soit pas sensible à la casse.
Merci :: X9
Voilà, je tente de faire une requête qui permet de faire une recherche sur l'ensemble de ma base de données Mysql...
Ma requête est de type :
SELECT * FROM ma_table WHERE `champ_1` LIKE %recherche% OR `champ_2` LIKE %recherche%..etc
-------------------------------------------------------------------------------------------------
Le problème est qu'avec ce type de requête, la casse n'est pas prise en compte... Si je tape ballon ou Ballonou encore BALLON je n'aurais pas le même résultat...
Je fais donc appel à vos services afin de trouver une solution à ce problème c'est à dire : pouvoir faire une requête de recherche (cf. ci dessus) dans la base de données qui ne soit pas sensible à la casse.
Merci :: X9
10 réponses
Tu fais en sorte préalablement que quand la personne tape quelquechose dans recherche, ce soit traduit en minuscule avec :
strtolower($StringAMettreEnMinuscule);
Puis tu utilise le LOWER pour le sql.
Je ne connais pas d'autres solutions.
strtolower($StringAMettreEnMinuscule);
Puis tu utilise le LOWER pour le sql.
Je ne connais pas d'autres solutions.
Bon je pense avoir trouvé :
Alors je récapitule la chose...
Mon problème consistait à mettre en place un petit moteur de recherche. Pour cela, une simple requête SQL à la fois :
- non sensible à la casse (BaLLon = ballOn = ballon = BALLON ...etc.)
- pas trop longue ...
1er ÉTAPE :
Après la validation de mon champ de recherche :
- Je récupère la chaine contenant les mots a rechercher séparés par une virgule (1).
- Je la sépare (par rapport au virgules) mot par mot dans un tableau (2).
- Je compte le nombre de mots dans mon tableau (3).
- J'initialise un petit compteur (4).
- On passe tous les mots de la recherche en minuscules (5).
- Je boucle afin d'obtenir une chaine comprenant tous mes mots séparés par un | [AltGr+6] (5)
- Je retire le premier caractère de la chaine (c'est a dire | ) (6)
Donc, au final, $suite contient mot1|mot2|mot3...etc
2eme ÉTAPE :
Construction de la requête.
- Les choses habituelles... (1)
- On concatène le reste de notre requête (2)
A savoir que :
- LOWER permet d'extraire le champ de la base de données, de le convertir en minuscules avant de le comparer.
- Le fait d'avoir nos mots sous la forme mot1|mot2|mot3 permet de faciliter la requête car on compare mot1 avec le champ précédemment passé en minuscules puis le mot2, le mot3...etc avant de passer au champ suivant.
- On ouvre la connexion à la base de données, on exécute notre requête (on récupère ce que l'on veut) et on ferme la connexion à la base de données... (3)
Voilà, mon problème est résolu... En espérant qu'il puisse aider d'autres codeurs plus tard :)
X9 (with CaPiT Help)
Alors je récapitule la chose...
Mon problème consistait à mettre en place un petit moteur de recherche. Pour cela, une simple requête SQL à la fois :
- non sensible à la casse (BaLLon = ballOn = ballon = BALLON ...etc.)
- pas trop longue ...
1er ÉTAPE :
Après la validation de mon champ de recherche :
- Je récupère la chaine contenant les mots a rechercher séparés par une virgule (1).
- Je la sépare (par rapport au virgules) mot par mot dans un tableau (2).
- Je compte le nombre de mots dans mon tableau (3).
- J'initialise un petit compteur (4).
- On passe tous les mots de la recherche en minuscules (5).
- Je boucle afin d'obtenir une chaine comprenant tous mes mots séparés par un | [AltGr+6] (5)
- Je retire le premier caractère de la chaine (c'est a dire | ) (6)
Donc, au final, $suite contient mot1|mot2|mot3...etc
<?php $tableaumot = explode(",",$_POST['mot']); (1 et 2) $nbrmot = count($tableaumot); (3) $k=0; (4) while($k < $nbrmot){ $mot=$tableaumot[$k]; if(substr($mot,0,1) == " "){ $mot = substr($mot,1); } $mot = strtolower($mot); (5) $suite = $suite."|".$mot; (6) $k++; } $suite = substr($suite,1); (7) ?>
2eme ÉTAPE :
Construction de la requête.
- Les choses habituelles... (1)
- On concatène le reste de notre requête (2)
A savoir que :
- LOWER permet d'extraire le champ de la base de données, de le convertir en minuscules avant de le comparer.
- Le fait d'avoir nos mots sous la forme mot1|mot2|mot3 permet de faciliter la requête car on compare mot1 avec le champ précédemment passé en minuscules puis le mot2, le mot3...etc avant de passer au champ suivant.
- On ouvre la connexion à la base de données, on exécute notre requête (on récupère ce que l'on veut) et on ferme la connexion à la base de données... (3)
<?php $requete="SELECT * FROM ma_table WHERE"; (1) $requete.="LOWER(`champ_1`) REGEXP '".$suite."' OR LOWER(`champ_2`) REGEXP '".$suite."' OR ...etc. (2) ...(3) ?>
Voilà, mon problème est résolu... En espérant qu'il puisse aider d'autres codeurs plus tard :)
X9 (with CaPiT Help)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Passer par les Regex (t'as 1ere solution) est une bonne idée.
Peut-être qu'en remplaçant le "LIKE" par "=" dans le Sql ça fonctionnerait ?
Peut-être qu'en remplaçant le "LIKE" par "=" dans le Sql ça fonctionnerait ?
Cette solution ne convient pas. Si dan la recherche, la personne tape Ballon, la recherche se fera sur ces 2 critères : "BALLON" et "ballon"... et si dans la base de données il y a "BaLLon" ? Ben... ca marche pas !
Cette solution de mettre en majuscules ou/et en minuscules n'est donc pas approprié pour ce que je souhaite faire... (Je pense même, sans vouloir te froisser, que c'est plutôt une mauvaise solution de faire cela)
Merci quand même...
X9
Cette solution de mettre en majuscules ou/et en minuscules n'est donc pas approprié pour ce que je souhaite faire... (Je pense même, sans vouloir te froisser, que c'est plutôt une mauvaise solution de faire cela)
Merci quand même...
X9
Je pense être sur la bonne piste...
Voyons voir...
- J'ai trouvé que pour être insensible a la casse je pouvais utiliser sql_regcase(), qui permet par exemple de transformer ballon en [Bb][Aa][Ll][Ll][Oo][Nn].
(ce qui donne dans la requête : SELECT * FROM ma_table WHERE `champ_1` = sql_regcase($recherche) OR `champ_2` = sql_regcase($recherche)..etc)
Problème constaté : Il me retourne tous les enregistrements ou il trouve un B ou un a ou un N ou encore un netc... et pas les enregistrements ou il trouve Ballon ou BaLLon ou encore BALLON uniquement etc...
- J'ai également trouvé la possibilité de mettre mes mots (ceux que je recherche) sous la forme ballon|trousse|soleil ... qui permet de rechercher soit ballon ou trousse ou soleil.
Problème constaté : c'est sensible à la casse... :(
Je continue mes recherches... Merci à celui qui trouvera avant !
X9
Voyons voir...
- J'ai trouvé que pour être insensible a la casse je pouvais utiliser sql_regcase(), qui permet par exemple de transformer ballon en [Bb][Aa][Ll][Ll][Oo][Nn].
(ce qui donne dans la requête : SELECT * FROM ma_table WHERE `champ_1` = sql_regcase($recherche) OR `champ_2` = sql_regcase($recherche)..etc)
Problème constaté : Il me retourne tous les enregistrements ou il trouve un B ou un a ou un N ou encore un netc... et pas les enregistrements ou il trouve Ballon ou BaLLon ou encore BALLON uniquement etc...
- J'ai également trouvé la possibilité de mettre mes mots (ceux que je recherche) sous la forme ballon|trousse|soleil ... qui permet de rechercher soit ballon ou trousse ou soleil.
Problème constaté : c'est sensible à la casse... :(
Je continue mes recherches... Merci à celui qui trouvera avant !
X9
C'est ce que j'ai tenté de faire mais comme je le disais plus haut
- avec sql_regcase(), ça cherche tous les mots qui contiennent un a ou un B ou un l...etc donc si je tape ballon (transformé en [Bb][Aa][Ll][Ll][Oo][Nn] par le reg_case() ) il me sortira aussi les lignes qui contiennent soleil (qui contient un l) ou trousse (qui contient un o) ou encore lune (qui contient un L)... etc
- avec l'autre solution c'est a dire de concaténer les mots en les séparant d'un | (AltGr+6), ç'est sensible a la casse... Mais en y ajoutant la solution de CaPiT je pense pouvoir trouver la solution...
X9
- avec sql_regcase(), ça cherche tous les mots qui contiennent un a ou un B ou un l...etc donc si je tape ballon (transformé en [Bb][Aa][Ll][Ll][Oo][Nn] par le reg_case() ) il me sortira aussi les lignes qui contiennent soleil (qui contient un l) ou trousse (qui contient un o) ou encore lune (qui contient un L)... etc
- avec l'autre solution c'est a dire de concaténer les mots en les séparant d'un | (AltGr+6), ç'est sensible a la casse... Mais en y ajoutant la solution de CaPiT je pense pouvoir trouver la solution...
X9