Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[PHP-MYSQL]Recherche sans tenir des comptes


tangui

Messages recommandés

Salut!

Petit probleme simple:

Je tape batiment dans mon moteur de recherche interne (php base mysql).

Dans ma base de données ce mot peut se trouver sous différentes formes:

batiment

bâtiment

 

Le soucis c'est que mysql tient compte de mes accents dans ma requete :P

Une idée pour contrer??

 

select * from toto where ( detail like 'batiment' or detail like '%batiment%' or detail like '%Batiment%' )

Lien vers le commentaire
Partager sur d’autres sites

Déjà, au lieu de t'embêter à faire "like '%toto%' or like '%TOTO%' or like '%Toto%' etc." tu peux commencer par faire un "toupper( ... ) like toupper('%toto%')"

Ensuite, je te conseille de te fabriquer toi-même une moulinette qui prend une chaine en entrée et remplace les caractères accentués par leurs équivalents non-accedntués (oui, à la mimine... on n'est jamais mieux servi que par soi-même).

Mieux encore : tu peux faire comme Pages Jaunes et faire de la recherche phonétique (en remplaçant les "ph" par des "f", les "tt" par un seul "t", ce genre de choses)...

Du coup, tu comparerais la transformation de ce que tu as en base à la transformation de ta chaine recherchée agrémentée des %%...

Lien vers le commentaire
Partager sur d’autres sites

Déjà, au lieu de t'embêter à faire "like '%toto%' or like '%TOTO%' or like '%Toto%' etc." tu peux commencer par faire un "toupper( ... ) like toupper('%toto%')

C'est déjà fait... mais en fait tout dépend de ma bdd, si c'est écrit en miniscule ou majuscule, et bien, il trouvera ou pas... :P

Ensuite, je te conseille de te fabriquer toi-même une moulinette qui prend une chaine en entrée et remplace les caractères accentués par leurs équivalents non-accedntués (oui, à la mimine... on n'est jamais mieux servi que par soi-même).

Mieux encore : tu peux faire comme Pages Jaunes et faire de la recherche phonétique (en remplaçant les "ph" par des "f", les "tt" par un seul "t", ce genre de choses)...

Du coup, tu comparerais la transformation de ce que tu as en base à la transformation de ta chaine recherchée agrémentée des %%...

Je suis tout a fait d'accord, mais le probleme reste entier vu que si dans ma base de donnée j'ai Toté, et que je cherche tote, je n'aurai aucune réponse...

Lien vers le commentaire
Partager sur d’autres sites

Salut tangui et KC...

je me suis retrouvé confronté au même pb il y a qq temps et j'ai fait un script qui crée un index sans accents...

 

du style

 

<?

function decode_index ($string)
{
   $trans_tbl = get_html_translation_table (HTML_ENTITIES);
   $trans_tbl = array_flip ($trans_tbl);
   return strtr ($string, $trans_tbl);
}


$tmp_sql="SELECT id_fic,titre_fic,accroche_fic,txt_fic FROM fiches";

$db_site->query($tmp_sql);
echo $db_site->num_rows();

while ($db_site->next_record()){
 	$concatenation_index=($db_site->f('titre_fic').$db_site->f('accroche_fic').$db_site->f('txt_fic'));
 //concaténation des 3 champs importants dans lesquels on fera la recherche
 $index=decode_index($concatenation_index);
 //on enlève les accents codés avec la fonction decode_index ci-dessus
 //note: on n'utilise pas la fonction html_entity_decode car la version 4.2 de php ne le permet pas
 $creation_index=str_replace($accents,"e",$index);
 //on enlève les accents
 $insertion_index_base=addslashes($creation_index);
 //on protège les champs pour la requête
 
 $identifiant_fichier_index=$db_site->f('id_fic');
 $insertion_index="UPDATE fiches SET index_fic='".$insertion_index_base."' WHERE id_fic='".$identifiant_fichier_index."'";
 
 $db_site_index->query($insertion_index);

}
?>

 

Bon c'est un code spécifique puisqu'il ne m'enlève que les accents sur les e...

La recherche doit se faire dans le champ d'index qui est une concaténation des 3 champs importants (titre, accroche, et fiche)

Pour les majuscules j'ai fait pareil que KewlCat et ça marche bien !

 

Ce script est lancé toutes les nuits dans le CRON.

 

A l'époque j'avais rien trouvé de mieux à faire...

 

Si ça peut t'aider...?

Modifié par minos
Lien vers le commentaire
Partager sur d’autres sites

C'est déjà fait... mais en fait tout dépend de ma bdd, si c'est écrit en miniscule ou majuscule, et bien, il trouvera ou pas... :(

 

Je suis tout a fait d'accord, mais le probleme reste entier vu que si dans ma base de donnée j'ai Toté, et que je cherche tote, je n'aurai aucune réponse...

476599[/snapback]

En appliquant la "transformation" à la fois au champ de ta table et à la chaine de recherche, tu vas comparer le "Toté" devenu "TOTE" à "%TOTE%" et ça va fonctionner...

Lien vers le commentaire
Partager sur d’autres sites

En appliquant la "transformation" à la fois au champ de ta table

Donc il faudrait que je créée une table temporaire qui traite mon champ en enlevant les accents afin de faire ma comparaison...

J'y avais pensé mais j'esperais trouver quelque chose de plus léger...

Lien vers le commentaire
Partager sur d’autres sites

Pas forcément une table complète mais ptet juste un champ d'index !

C'est le plus simple en effet... arf! dommage, avec postgres, je crois qu'on pouvait lui dire de transformer un champ ou de ne pas tenir compte des maj, accents etc...

Lien vers le commentaire
Partager sur d’autres sites

Donc il faudrait que je créée une table temporaire qui traite mon champ en enlevant les accents afin de faire ma comparaison...

J'y avais pensé mais j'esperais trouver quelque chose de plus léger...

476610[/snapback]

Ca dépend.

Si tu disposes de peu de place disque, tu fais la manip "à la volée" lors de la requête.

Si tu disposes de moyens de traitement limités (un serveur sur un Pentium 133 par exemple), tu ajoutes le champ pré-transformé dans ta table.

 

Au choix. Perso j'étais plutôt parti sur la solution 1 (manipulation de chaines de caractères lors des requêtes, c'est assez simple à faire) mais après tu fais comme tu le sens...

Lien vers le commentaire
Partager sur d’autres sites

Etant donné que le serveur mysql travaille bcp, je préfère la soulager autant que possible...

Je vais faire la solution 2...

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...