Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb de recherche a cause des accents

9 réponses
Avatar
Michel Angelosanto
Bonjour,
Sur mon site, j'ai mis un moteur de recherche par mots clés. Je mets en
majuscules la ou les clés de recherche et je compare au contenu des
enregistrements après l'avoir aussi mis en majuscules.
Cela ne fonctionne pas si une clé contient un caractère accentué. Avez vous
une astuce ou un exemple qui ferait ce genre de chose?
Voici ma requête:
mise de la clé en majuscules
$clé=strtoupper($clé);//ici un é reste un é alors que je voudrais mettre E

requête

$SQL=mysql_query("select count(*) from liens where ((etat='1') and
(UCASE(titre) like '%$cle1%'))")// la aussi il faudrait remplacer les é par
des E etc ...



Merci d'avance et bon dimanche.


--
Michel Angelosanto, Bordeaux
http://angelosa.free.fr

9 réponses

Avatar
Olivier Miakinen

Sur mon site, j'ai mis un moteur de recherche par mots clés. Je mets en
majuscules la ou les clés de recherche et je compare au contenu des
enregistrements après l'avoir aussi mis en majuscules.
Cela ne fonctionne pas si une clé contient un caractère accentué. Avez vous
une astuce ou un exemple qui ferait ce genre de chose?


Même si la question revient assez régulièrement sur ce groupe, et que
la fonction pour la traiter se trouve facilement dans la doc, elle
cache suffisamment de problèmes annexes pour s'y attarder un petit peu
(peut-être ensuite pourra-t-on demander au FAQteur de l'inclure dans la
FAQ du groupe).


Tout d'abord, si ta chaîne est en ISO-8859-1, qui est le jeu de
caractères par défaut de PHP, il te suffit d'utiliser la fonction
strtr() <http://fr.php.net/manual/fr/function.strtr.php> :

$str = strtr($str, "àáâãäåæçèéêëìíîï(...)", "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ(...)");


Note que tu peux aussi remplacer chaque caractère minuscule $char par
chr(ord($char) - 32), mais ceci n'est à faire *que* pour les caractères
minuscules, c'est-à-dire ceux dont ord($char) est dans l'une des zones
suivantes : 97-122,224-246,248-254 (223 et 255 sont exclus car ils n'ont
pas d'équivalent en majuscule dans ISO-8859-1).


Mais si tu n'es pas en ISO-8859-1, tu dois d'abord savoir quelle table
est utilisée, puis te servir de str_replace ou preg_replace si les
caractères peuvent se trouver sur plusieurs octets. Bref, ce n'est pas
forcément simple.


Une autre piste, c'est le fonctionnement de strcmp() ou de strcoll()
selon la valeur de setlocale(LC_COLLATE), mais cela semble assez
aléatoire selon les plateformes et les versions de PHP (voir la doc
sur <http://www.php.net> pour plus d'infos).


Voici ma requête:
mise de la clé en majuscules
$clé=strtoupper($clé);//ici un é reste un é alors que je voudrais mettre E


Euh... tu voudrais remplacer « é » par « E », pas par « É » ?!? C'est
alors un problème légèrement différent de celui dont tu parlais, en
l'occurrence supprimer les accents. Il te suffit de remplacer « é »
par « e » par l'une des méthodes ci-dessus, avant d'appeler la fonction
strtoupper() habituelle.


$SQL=mysql_query("select count(*) from liens where ((etat='1') and
(UCASE(titre) like '%$cle1%'))")// la aussi il faudrait remplacer les é par
des E etc ...


Je ne suis pas compétent pour savoir s'il existe une fonction directe en
SQL, et le groupe pour en parler sera <news:fr.comp.applications.sgbd>.
Mais bon, tu peux toujours faire les transformations en PHP avant de
passer le résultat à SQL.


En espérant avoir aidé (et que d'autres complèteront si on veut en faire
une entrée dans la FAQ un jour).
--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Michel Angelosanto
Merci pour ces infos de qualité.

Même si cela me semble complexe pour l'instant pour arriver au résultat
escompté à 100%,
je pense que je vais déjà pouvoir faire un grand pas en avant grâce à ton
aide.
A+

--
Michel Angelosanto, Bordeaux
http://angelosa.free.fr
Avatar
Missions courtes
Bonjour,
Si je ne me trompe pas le problème ne se pose pas
dans le cas d'une recherche dans une table SQL de MySQL.
La recherche dans une colonne est indépendante :
- Des caractères accentués,
- Des Majuscules / Minuscules.

Ainsi le mot " Intégration " sera trouvé si les critères
de recherche sont " Intégration " ou " integration ".

Cordialement.
Avatar
Olivier Miakinen

Merci pour ces infos de qualité.

Même si cela me semble complexe pour l'instant pour arriver au résultat
escompté à 100%,
je pense que je vais déjà pouvoir faire un grand pas en avant grâce à ton
aide.


Note que je ne connais rien à SQL, mais que la réponse de mesdames (ou
mesdemoiselles) Missions courtes¹ te donne des infos à ce sujet.

--
Olivier Miakinen
¹ Je ne connais pas ce prénom, mais cela semble être du féminin pluriel.

Avatar
John GALLET
je pense que je vais déjà pouvoir faire un grand pas en avant grâce à ton
aide.



Si tu étais au bord du gouffre, c'est pas nécessairement une bonne idée...

Note que je ne connais rien à SQL,
Mais si, mais si.


mais que la réponse de mesdames (ou
mesdemoiselles) Missions courtes¹ te donne des infos à ce sujet.


Ca me semble être extrêmement spécifique mysql, ou dépendant de la
config du serveur sgbd.

En tant que "FAQteur" comme tu dis, à mon sens, la seule réponse
faisable est "ça dépend du sgbd et de ce qu'on stocke dedans". Par
exemple, sous Oracle, on va essayer dans certains cas de plutôt se
servir de CONTEXT. Mais ça n'empêche pas d'essayer de faire une réponse
à tiroirs en prenant des cas concrets précis couvrant la majeure partie
des besoins et puisque tu te proposes si gentiment ;-)...

JG


Avatar
Olivier Miakinen

Ca me semble être extrêmement spécifique mysql, ou dépendant de la
config du serveur sgbd.

[...]
Mais ça n'empêche pas d'essayer de faire une réponse
à tiroirs en prenant des cas concrets précis couvrant la majeure partie
des besoins et puisque tu te proposes si gentiment ;-)...


Oui, je veux bien. Pas pour les bases de données (un de ces jours,
promis, j'essaierai de m'y mettre) mais pour gérer différents cas en PHP
selon le charset.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Missions courtes
Bonjour,

Olivier Miakinen
Note que je ne connais rien à SQL, mais que la réponse de mesdames (ou
mesdemoiselles) Missions courtes¹ te donne des infos à ce sujet.
¹ Je ne connais pas ce prénom, mais cela semble être du féminin pluriel.


Le site Missions Courtes est ouvert aux DEUX sexes.

John GALLET
Ca me semble être extrêmement spécifique mysql, ou dépendant de la
config du serveur sgbd.


Ma méthode fonctionne très bien avec MySQL 3.23.43
sur mes serveurs hébergés chez OVH.
(J'ai de la veine que cela fonctionne correctement)

Cordialement.
Michel FOUILLADE

Avatar
John GALLET
Ca me semble être extrêmement spécifique mysql, ou dépendant de la
config du serveur sgbd.


Ma méthode fonctionne très bien avec MySQL 3.23.43


Je n'ai jamais dit le contraire, seulement que pour un article de FAQ
c'est un peu léger. Quand je parle de config serveur, je fais par
exemple allusion à Sybase, si on se met via sqlloc (de mémoire) en
BINARY CASE-INSENSITIVE SORT ORDER ça devrait marcher (encore que, il
faudrait le vérifier, j'ai un doute, mais en toute autre config, je ne
garantis rien (ou encore moins).

a++;
JG


Avatar
simonced
Ce problème (si on appele ca un problème) n'apparait que si on
utilise MySQL > 4.1.
En effet, cette version et les suivantes gerent (on tentent de gérer)
en natif les chaines multi-octets. La requête qui avant permettait de
faire un where insensible à la casse et sans tenir compte des accents,
c'est fini.

Le plus simple est de faire un truc du genre :
//ne pas modifier $cle1 (pas de upper ni rien)
SELECT CONT(*) FORM liens WHERE ((etat='1') AND COVERT(titre USING
utf8) like '%$cle1%'))
//Ma requête n'est peut-être pas complètement fonctionnelle, mais ca
doit être un début, en fouillant en peut et en regardant les erreurs
de MYSQL ca doit marcher simplement.

Deplus, bien faire attention que le champs de recherche soit dans un
charset type "latin1-sweedish-ci" qui ignore la casse et pas avec
l'option binaire évidement.

Maitenant, biensûr tout mon baratain ne sert que si mysql est en
version 4 ;)
En espérant éclairer un peu ;)
Ced.