Recherche sans tenir compte des accents

Résolu
titi2111 Messages postés 7 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juin 2008 - 23 juin 2008 à 16:14
titi2111 Messages postés 7 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juin 2008 - 24 juin 2008 à 13:39
Bonjour,

J'ai créé un catalogue php pour effectuer des recherche dans une base MySQL. Je voudrais que lorqu'on rentre un mot clef avec ou sans accents, toutes les lignes contenant ce mot avec ou sans accent ressortent.

J'ai donc trouvé une fonction php assez simple pour enlever tous les accents des mots clefs entrées:

function enleve_accent($chaine){
    $search = array ('@[ÈÉÊËèéêë]@i','@[ÀÁÂÃÄÅàáâãäå]@i','@[ÌÍÎÏìíîï]@i','@[ÙÚÛÜùúûü]@i','@[ÒÓÔÕÖØòóôõöø]@i','@[Çç]@i','@[ÿ]@i','@[Ññ]@');
    $replace = array ('e','a','i','u','o','c','y','n');
    return preg_replace($search, $replace, $chaine);
 }

Ce qui me pose un problème, c'est que tous les champs de ma base ont subi un "htmlentities", je cherche donc une requête  MySQL me permettant d'ignorer les é
à
è
et les nombreux autres...

Merci pour votre aide.

2 réponses

titi2111 Messages postés 7 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juin 2008 1
24 juin 2008 à 13:23
J'ai finalement trouvé une solution:

La fonction pour enlever les accents des mots clefs de recherche:
function enleve_accent($chaine){
    $search = array ('@[ÈÉÊËèéêë]@i','@[ÀÁÂÃÄÅàáâãäå]@i','@[ÌÍÎÏìíîï]@i','@[ÙÚÛÜùúûü]@i','@[ÒÓÔÕÖØòóôõöø]@i','@[Çç]@i','@[ÿ]@i','@[Ññ]@');
    $replace = array ('e','a','i','u','o','c','y','n');
    return preg_replace($search, $replace, $chaine);
 }

La fonction pour remplacer les &...; dans la recherche sql:
function enleve_accent_sql($chaine) {
$search=array('È','É','Ê','Ë','è','é','ê','ë','À','Á','Â','Ã','Ä','Å','à','á','â','ã','ä','å','Ì','Í','Î','Ï','ì','í','î','ï','Ù','Ú','Û','Ü','ù','ú','û','ü','Ò','Ó','Ô','Õ','Ö','ò','ó','ô','õ','ö','Ç','ç','ÿ');
$replace=array('e','e','e','e','e','e','e','e','a','a','a','a','a','a','a','a','a','a','a','a','i','i','i','i','i','i','i','i','u','u','u','u','u','u','u','u','o','o','o','o','o','o','o','o','o','o','c','c','y');
for ($i=0;$i<$c=count($search);$i++) {
$chaine = "REPLACE(($chaine),'".htmlentities($search[$i],ENT_QUOTES)."','$replace[$i]')";
}
return $chaine;
}

$mot = enleve_accent($_POST["mot"]);

Recherche du mot dans la base:
$query = "SELECT * FROM fiches_ouvrages
        WHERE ".enleve_accent_sql(COLONNE)." LIKE "%$mot%")";

C'est pas tres élégant mais ça fonctionne...
Avertissez moi si vous connaissez une autre méthode.
1
titi2111 Messages postés 7 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juin 2008 1
24 juin 2008 à 13:39
Oups la dernière ligne c'est
WHERE ".enleve_accent_sql("COLONNE")." LIKE "%$mot%")";

Sans les guillemets ça marche moins bien...
0
Rejoignez-nous