Bonjour à tous,

Ce sujet est traité moulte fois, et pourtant il fait encore des ravages.
On lit aussi tout et n'importe quoi, si bien que je reste perdue avec mon problème.

pour mon moteur de recherche j'utilise LIKE dans ma requete.
D'après ce post, LIKE devrait me permettre de trouver les mots avec ou sans accents etc.
Mais ça ne fonctionne pas.

Est-ce parce que les accents sont enregistrés "é" au lieu de "é" ? apparemment non...
J'ai testé en rentrant directement l'accent dans la base, comme ceci : "activité", mais la recherche sur ce mot avec accent ne fonctionne pas, par contre il trouve "activite" sans l'accent.
si le mot activité est enregisté, il trouvera le terme "activité" mais pas "activite" sans l'accent.

au secours ! Smiley biggol

j'ai cru comprendre que l'utf8 était bien, alors :
J'ai re-créé ma base en utf8_general_ci, avec un interclassement et jeux de caractères en utf8_general_ci
Pour rentrer les données, je suis obligée d'utiliser un éditeur pour mes clients, j'ai mis ckeditor.
j'ai mis ensuite dans ma requete
$_POST['descriptif']=utf8_encode($_POST['descriptif']);

Ma page s'affiche avec
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Bref, comment être plus utf8 que ça..?

En vous remerciant de vos conseils...
Modifié par eliza (14 May 2014 - 12:18)
Bonjour,

et merci de ton aide,
oui j'ai essayé
"select champ COLLATE utf8_unicode_ci LIKE "%'.$mot.'%" AND .. etc."


et d'autres endroits, ce qui donne une erreur :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

qui me renvoie à :
while($dnn = mysql_fetch_array($requete)) {
Bonsoir !

j'ai en partie résolu le problème.

puisque "é" n'était pas trouvé dans la base, car les accents étaient codés "&eacute;", j'ai transformé les accents de la recherche pour les conformer au contenu de la table plutôt que le contraire.

ça donne ça :
$rec2 =htmlentities($_GET['recherche'],ENT_NOQUOTES, "UTF-8");

Ainsi les mots comme "activité" font ressortir les bons résultats.
Malheureusement ça ne permet pas de faire afficher les contenus "activité" en recherchant "activite" sans l'accent.

si vous avez des idées je suis preneuse, et si ça peut servir à quelqu'un...

Bonne soirée !
Bonjour,

D'accord.
Et as-tu essayé de faire quelque chose du genre :
 "SET CHARACTER SET utf8"
?
Transformer les accents en entités ne devrait pas être la solution. Ca empêche à coup sûr et de manière durable de trouver le nom enregistré avec accent à partir de la version sans accent. Ca fout en l'air toutes les fonctions de recherches et d'intex. En gros c'est du bricolage, c'est certain. Les entités, c'est un problème d'affichage HTML, pas un problème de stockage en base normalement.

J'ai l'impression que le problème est déjà revenu plusieurs fois ici et ailleurs, mais que personne n'a jamais vraiment posté de solution claire et précise allant du début à la fin.

Je n'ai malheureusement pas non plus la solution pour que ça marche à coup sûr. Tout est configuré en UTF-8, et un petit test rapide fonctionne sans problème chez moi avec MySQL 5.5 :


create temporary table test (
name varchar(32) not null,
age int not null,
primary key(name))

0 rows affected in 0.52ms

insert into test (name, age) values
('Cecile', 75),
('Aurélie', 23),
('François', 34)

3 rows affected in 0.22ms
Last insert ID : 0

select * from test where name like 'Cécile'

1 returned records in 0.25ms : 

name age 
Cecile 75

select * from test where name like 'Aurélie'

1 returned records in 0.22ms : 
name age 
Aurélie 23

select * from test where name like 'Aurelie'

1 returned records in 0.22ms : 
name age 
Aurélie 23

select * from test where name = 'Francois'

1 returned records in 0.21ms : 
name age 
François 34

show full columns from test

2 returned records in 0.39ms : 
Field Type Collation Null Key Default Extra Privileges Comment 
name varchar(32) utf8_general_ci NO PRI <null> <null> select,insert,update,references <null> 
age int(11) <null> NO <null> <null> <null> select,insert,update,references <null>

drop table test

0 rows affected in 0.21ms

9 requests executed in 2.22ms in total

Désolé pour la présentation un peu limite, copier-coller du HTML dans une zone de texte pure n'est pas forcément optimal...

A noter dans cet exemple que ça a l'air de fonctionner indifféremment avec like ou =, indifféremment dans les deux sens (de accentué à pas accentué comme vice-versa), et que la colation est utf8_general_ci.

Ce qui fait peut-être la différence, est de s'assurer que tous les maillons soient bien en UTF-8 :
1. La collation de la base, des tables et des champs (à faire une bonne fois pour toute et après il n'y a plus à s'en soucier normalement)
2. L'encodage de la connection (set names utf8) (à mon avis c'est celui-là qui est le plus souvent oublié)
3. L'encodage indiqué en en-tête HTTP (parfois oublié)
4. L'encodage indiqué dans meta charset (normalement pas important si l'en-tête HTTP est bien renseigné; mais mieux vaut vérifier qu'il soit avec soi plutôt que contre soi)
5. L'encodage effectif de la page HTML où sont affichées les informations et d'où le formulaire d'insertion/modification est envoyé (important!)


En bonus
6. Si on utilise la ligne de commande, vérifier qu'elle est bien en UTF-8 aussi (sous linux nnormalement c'est par défaut, mais sous windows argh!)
7. Si on importe via des fichiers, bien vérifier qu'ils soient aussi en UTF-8 et qu'ils envoient aussi la commande set names utf8 (c'est vite oublié ça)

Évidemment, il suffit que ou bien le site, ou bien le gestionnaire utilisé pour insérer/importer les données ne suive pas tout à la lettre et paf, quelque chose est cassé quelque part, et forcément, ça ne marche plus.
Merci QuentinC,

j'ai en effet lu beaucoup de questions identiques à la mienne dans les forums, sans trouver de réponse claire.

Cette réponse en éclairera plus d'un !
Bonjour,

J'avais aussi eu ce problème il y a peut de temps pour faire des recherche dans ma base de donnée.
Mon cas personnel c'était que je devais dans un input taper : "Jérôme" ou "Jerome" et trouver les même résultats. Alors j'ai pas mal galéré pour trouver sur les différent forum mais voilà ce que j'ai fais.

D'abord je vérifie que ma page est bien en UTF-8 (sans BOM) :
https://www.phpbb.com/kb/images/585_encoding.jpg

Ensuite ma base de donnée est en "utf8_general_ci" (Si mes couvenir son bon et que je dit pas de connerie le _ci veut dire qu'il n'est pas sensible à la case, donc pas de différence en "é" et "e" ou J et j, mais à vérifier).

Ensuite quand je me connect à la base de donnée en PHP c'est en UTF-8


$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host='.$host.';dbname='.$db.'', $user, $passwd, $pdo_options);
$bdd->exec("SET CHARACTER SET utf8");

(C'est surtout la dernière ligne la plus importante)

Après ma page était en UTF-8 aussi :


<meta charset="utf-8"/>


Et quand je faisais des requêtes dans ma base c'était comme ça :


SELECT * FROM contact WHERE ('prenom') LIKE CONVERT(_utf8 '".$_GET['prenom']."%' USING utf8) COLLATE utf8_general_ci)


Donc voilà, c'est tout ce dont je me souviens. Test un peu tout et dis moi si ça marche pour toi.