Recherche de mots finis par un accent - MYSQL

Fermé
P421 - 31 mai 2011 à 16:57
 P421 - 3 juin 2011 à 19:26
Bonjour,


J'ai mis en place mon propre petit moteur de recherche et il marche ... presque bien !

Quand un mot cherché contient un accent, ça fonctionne, sauf si le mot se termine par un accent.
Par exemple la recherche du mot "région" fonctionne parfaitement.
La recherche du mot "cité" ne fonctionne pas du tout.

J'ai fait un test en modifiant mes données :
La recherche du mot "citée" fonctionne mais pas celle de "citeé".

Comment est-ce que je peux faire pour corriger le problème ?

La requête que j'utilise est la suivante :
$requete_nom="select ID from table1 WHERE (table1.nom like \"%$mot%\")";




Merci,

P421
A voir également:

10 réponses

dragondark Messages postés 465 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 27 avril 2016 157
Modifié par dragondark le 31/05/2011 à 17:03
$requete_nom="select ID from table1 WHERE (table1.nom like '%$mot%')";  

ps : si tu utilise du table1.nom utilise le aussi la : table1.ID


cordialement
Dragondark de Lonlindil
LE POUVOIR EST NOTRE GLOIRE
LE COEUR NOTRE HONNEUR
0
oui, tu as raison. J'ai un peu trop simplifié ma requête dans le forum.

La requête est bien sous la forme :
$requete_nom="select table1.ID from table1 WHERE (table1.nom like '%$mot%')";

Je ne comprends pas pourquoi terminer un mot par une lettre accentuée bloque mes recherches.
Pour éviter ça, j'ai aussi cherché en supprimant tous les accents :

function stripAccents($string){ // Pour supprimer les accents
return strtr($string,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
}
$mot = stripAccents($mot_avec_accents);

$requete_nom="select table1.ID from table1 WHERE (stripAccents(table1.nom) like \"%stripAccents($mot)%\")";

Ca ne marche pas car stripAccents(table1.nom) ne semble pas pris en compte dans la requête alors que %stripAccents($mot)% fonctionne.
0
dragondark Messages postés 465 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 27 avril 2016 157
1 juin 2011 à 11:32
c'est normal tu essaye de mettre du php dans du SQL,
Ta table est sou quel format?
Est-ce que tu est sur d'avoir mis ces mots dans tes tables?
et met des simples cote au lieu de double pour les chaines.

essaye cela : select table1.ID from table1 WHERE (stripAccents(table1.nom) like CONVERT(_utf8 '%$nom%' USING utf8) ;

cela devrai te retourner les mots avec ou sans accents.
cité = cite = cîte = citè etc...
en gros il ne tien pas compte des accents utile pour les moteurs de recherche.

Cordialement
Dragondark de Lonlindil
0
J'ai essayé masi ça me donne le même résultat qu'avant.
Je vais quand même essayer de creuser l'idée de la fonction convert avec le standard utf8.

Cordialement,

P421
0
mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
3 juin 2011 à 10:09
Bonjour,

ATTENTION: le script php est-il également encodé UTF8? Avez-vous bien ouvert la bdd en UTF8?

Pour tout ces problèmes d'encodage, voici quelques explications pour bien travailler en 'full-UTF8':
http://html5.immo-scope.com/index.php?page=general/applisFullUtf8

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dragondark Messages postés 465 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 27 avril 2016 157
2 juin 2011 à 16:37
tu est en innodb?

Cordialement
Dragondark de Lonlindil
0
je ne sais pas si je suis en innodb. A priori je dirai que oui.
Je suis en environnement LAMP sur mon serveur dédié et j'utilise EasyPHP sur mon PC pour tester mon site avant de le mettre en ligne.
L'interclassement pour la connexion MySQL est : utf8_general_ci

Ce qui est très bizarre est que la recherche des accents fonctionne correctement sauf si la lettre accentuée est la dernière d'un mot cherché.

J'ai trouvé une solution alternative mais pas top : j'ai créé un second champ dans ma table que j'appelle "champ_sans_accent".
Avec ma fonction stripAccents (voir plus haut dans la conversation), je rempli ce champ (phase d'initialisation).
Ensuite, lorsque je cherche un mot accentué, je le fais d'abord passer aussi par cette même fonction puis je lance la recherche.
C'est pas top, ça m'oblige à rafraîchir de temps en temps ce nouveau champ, mais ça fonctionne.

Par contre, si la recherche marchait directement avec les accents, ça me simplifierai bcp la vie !

A+,

P421
0
dragondark Messages postés 465 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 27 avril 2016 157
3 juin 2011 à 10:40
est-ce que lors que tu fais des recherche via le moteur de recherche de phpmyadmin ça fonctionne?
si oui récupère leurs code SQL

Sinon l'idée de faire un champs sans accents est bien mais duplique la taille mémoire nécessaire pour ce que tu cherche à faire

Cordialement
Dragondark de Lonlindil
0
Très bonne idée que regarder comment ils font avec le moteur de phpmyadmin car effectivement leurs recherches fonctionnent.
C'est dans la page sql.php.

Cependant, cette page utilise tellement de fonction, routines & variables pour gérer tous les cas d'une manière générale que je m'y perds.

A l'occasion j'essaierai de décortiquer leur code qui me permettra d'avoir une solution plus optimisée que celle que j'ai adoptée par duplication de la taille mémoire et par refresh batchs...


Merci pour ton aide Dragondark de Lonlindil

Cordialement,

P421
P.S. pour ceux qui rencontreraient la même difficulté que moi : dans la fonction stripAccents, j'ai ajouté à la liste des caractères définie plus haut dans la discussion un remplacement du caractère " par un espace.
0
dragondark Messages postés 465 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 27 avril 2016 157
3 juin 2011 à 16:00
tu as plus simple ;)

tu regarde la requête qui est émise il te l'affiche au dessus de la réponse.

Cordialement
Dragondark de Lonlindil
0
effectivement...
Bon est bien la requête obtenue est :
SELECT * FROM 'voyage' WHERE 'nom' LIKE '%cité%' LIMIT 0 , 30
c'est à peu près ce qui devrait fonctionner sur mon moteur de recherche.

Je vais rester pour le moment sur ma solution par traitements batchs réguliers pour remplir le champ d'interrogation sans accents de ma table.

Cordialement,

P421
0