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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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> :
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.)
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> :
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.)
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> :
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.)
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
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
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
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.
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 ".
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.
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.
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.
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.
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
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 ;-)...
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
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.)
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.)
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.)
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
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)
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
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
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).
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
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.
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.
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.