Moteur de recherche interne et les accents

Répondre
surfeurdu33
le 17/10/2007 à 22:31
surfeurdu33
Bonsoir à tous,

Je suis en train d'essayer de mettre en place un petit moteur de recherche pour mon blog.

J'ai utilisé l'un des tutos dispo ici et le moteur de recherche fonctionne très bien.
Mais il fonctionne quand la requète ne contient pas d'accents.

Exemple : si je recherche "maison" il va me trouver les articles correspondants sans problème.

Par contre si je recherche le mot "période" il me trouvera bien les articles contenant "période" mais j'aimerai aussi qu'il me trouve les articles avec le mot "periode".

Et inversement bien sur.

Voiçi le code :

<?php
if(isset($_POST['requete']) && $_POST['requete'] != NULL)
{
include('include/cnx_mysql.php');
$requete = htmlentities($_POST['requete'], ENT_QUOTES);

$query = mysql_query("SELECT * FROM blog WHERE body LIKE '%$requete%' ORDER BY id DESC") or die (mysql_error());
$nb_resultats = mysql_num_rows($query);
if($nb_resultats != 0)
{

?>
<h3>Résultats de votre recherche.</h3>
<p>Nous avons trouvé <?php echo $nb_resultats;
if($nb_resultats > 1) { echo ' résultats '; } else { echo ' résultat '; }
?>
dans notre base de données. Voici les fonctions que nous avons trouvé :<br/>
<br/>
<?php
while($donnees = mysql_fetch_array($query))
{
?>
<a href="fonction.php?id=<?php echo $donnees['id']; ?>"><?php echo $donnees['head']; ?></a><br/>
<?php
}
?><br/>
<br/>
<a href="test.html">Faire une nouvelle recherche</a></p>
<?php
}
else
{
?>
<h3>Pas de résultats</h3>
<p>Nous n'avons trouvé aucun résultats pour votre requête "<?php echo $_POST['requete']; ?>". <a href="test.html">Réessayez</a> avec autre chose.</p>
<?php
}
mysql_close();
}
else
{
?>
<p>Rechercher dans le blog</p>
<form action="<?phpphp $_SERVER['PHP_SELF'] ?>" method="Post">
<input type="text" name="requete" size="10">
<input type="submit" value="Ok">
</form>
<?php
}

?>


Les données dans ma base de données sont stockés avec des caractères du genre &eacute; &agrave;.

Les interclassements des tables sont en "latin1_swedish_ci" et mes pages en ISO-8859-1.

Est-ce que quelqu'un pourrait me donner quelques astuces ou pistes ?

Faut-il stocker les mots directement avec des accents dans la base de données ?

Ou faut-il faire comme je le fais faire un htmlentities avant de les insérer dans la base de données.

Le problème après avec le htmlentities, c'est que si je dois faire des recherches avec LIKE , si j'ai des données de type : &eacute dedans il ne me trouvera jamais de résultats le moteur de recherche.

J'espère être clair, et merci d'avance si vous pouvez m'aider.
LA GLOBULE
le 17/10/2007 à 22:54
LA GLOBULE
Les données dans ma base de données sont stockés avec des caractères du genre &eacute; &agrave;


Cherche pas plus loin, le problème est là.
Çà, c'est parce que tu fais un htmlentities avant de mettre tes infos en base.

Faut-il stocker les mots directement avec des accents dans la base de données ?
Ou faut-il faire comme je le fais faire un htmlentities avant de les insérer dans la base de données.


Il faut laisser les données brutes en base, et faire le htmlentities à l'affichage de la donnée (pour éviter ce genre de problème notamment. De plus, on sait jamais si un jour tu dois sortir du plain text ou du XML de ta base, ben tes accents seront morts).

Ensuite, ben ton problème sera obsolète car dans mysql, la recherche dans du texte (que ce soit du varchar ou du text) n'est pas case sensible, et mysql fera abstraction des accents lors de la recherche.

exemple_session_mysql
mysql> SET CHARACTER SET latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE test (test VARCHAR( 255 ) NOT NULL);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO test (test) VALUES ('pom blu école toto');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM test;
+--------------------+
| test |
+--------------------+
| pom blu école toto |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test WHERE test LIKE '%Ecole%';
+--------------------+
| test |
+--------------------+
| pom blu école toto |
+--------------------+
1 row in set (0.00 sec)

mysql> ALTER TABLE `test` CHANGE `test` `test` TEXT;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM test WHERE test LIKE '%ecOle%';
+--------------------+
| test |
+--------------------+
| pom blu école toto |
+--------------------+
1 row in set (0.00 sec)
surfeurdu33
le 18/10/2007 à 00:32
surfeurdu33
Bon et ben va falloir que je modifie plus de 700 entrées dans la base...

Un petit script avec str_replace devrait faire l'affaire.

Merci beaucoup pour cette réponse parfaite et rapide.
LupusMic
le 18/10/2007 à 07:34
LupusMic
Tu n'as pas besoin de PHP pour faire la modification. Une simple requête SQL suffit.

Regarde Update et replace devraient pouvoir t'aider.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
azou_06
le 23/01/2008 à 10:31
azou_06
Salu moi aussi je doit creér un moteur de recheche sa te dérangerai de m'aider en me montrant le contenu de ton fichier cnx_mysql.php
merci..
24
LA GLOBULE
le 23/01/2008 à 12:12
LA GLOBULE
Heu, son fichier cnx_mysql.php ne doit contenir que deux lignes de PHP : les deux lignes qui permettent de se connecter à une base MySQL (ca doit être un mysql_connect plus un mysql_select_db).
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours