[PHP] moteur de recherche interne

Voilà je n’ai pas de connaissances appronfondie en php, je souhaite juste modifier le script de moteur de recherche intégré à mon site. En effet celui ci ne permet pas pour le moment de faire des recherches « multi critéres ». C’est à dire si je tape dans le formulaire « vert bleu » il va chercher toutes les pages où y marqué vert OU bleu, alors que moi je voudrais qu’il me sorte que les pages où y marqué vert ET bleu à la fois dans la même page.

J’ai pensé faire un truc du genre on met un « + » et ça fait ce que je souhaite, on met un « - » et ça enlève certains mots qu’on veut pas… bref comme google fait. Mais mes connaissances sont trop faibles en php et j’en chie :stuck_out_tongue:

Voici le code que j’ai déjà et qui marche très bien :

$chaine_search_ex = $multi_chaine_search; //Recherche dans la table ARCHIVES open_table(); echo "<DIV ALIGN=center>Résultats dans les Archives</DIV>"; $sql = "SELECT * FROM archives WHERE "; $nouvelle_rech = array(); $nouvelle_rech = explode(" ", $chaine_search_ex); $multi_chaine_search = array(); $multi_chaine_search = $nouvelle_rech; $tab_requete = array(); for($i = 0; $i < sizeof($nouvelle_rech); $i++) { if($i!=(sizeof($nouvelle_rech)-1)) $sql .= " nom LIKE '%$multi_chaine_search[$i]%' OR description LIKE '%$multi_chaine_search[$i]%' OR "; else $sql .= " nom LIKE '%$multi_chaine_search[$i]%' OR description LIKE '%$multi_chaine_search[$i]%' "; } $sql .= " ORDER BY id"; $tab_requete[0] = reqmysql($sql); $nb_results = mysql_num_rows($tab_requete[0]); if ($nb_results>0){ echo "<CENTER><I>$nb_results résultat(s)</I></CENTER>"; $i=0; while ($ligne = mysql_fetch_object($tab_requete[0])) { echo "<IMG SRC=themes/$theme/images/archives/puce.gif ALIGN=absmiddle> <A HREF=index.php?mod=archives&ac=voir&id=".$ligne->id.">".stripslashes(bbcode($ligne->nom))."</A><BR>"; $i++; } } else echo "<CENTER><I>Aucun résultat.</I></CENTER>"; close_table();

Comme vous le voyez le champ dans lequel l’utilisateur tape sa recherche est « $chaine_search_ex » et dans cette partie du code on va chercher dans la table « archives ».

Si une personne sympa pouvait m’aguiller sur les modifs à faire ça serait super sympa :stuck_out_tongue: Ah oui c’est urgent :stuck_out_tongue:

J’ai fait une erreur en copient le code, je l’ai réparée et mis en gras

EDIT : ça marche pas le gras, l’erreur etait dans la ligne le + longue; à la fin c’est OR et pas AND (le AND c’est moi qui l’avais mis pour tester un truc)

remplace les “OR” par des “AND” dans la ligne $sql .= “…”

[quote name=’[PERE]Cil’ date=’ 10 Jan 2005, 17:27’]remplace les « OR » par des « AND » dans la ligne $sql .= « … »
[right][post=« 320848 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Déjà essayé mais ça semble ne pas fonctionner… c’est bizarre parce que moi aussi au départ il me semblait que la solution était aussi simple que ça mais ça merde quelque part :stuck_out_tongue:

non non non, il fait une recherche entre le nom ou la description d’un article, donc il faut laisser le OR.

Je préconisait une solution à base de requetes imbriquées.
A grands coups de INTERSECT ( + ) et EXCEPT ( - ) .
On recherche le premier mot INTERSECT recherche second mot.
un site qui explique les imbrication avec la théorie des ensembles en math
Mais il va falloir écrire une fonction pour “décoder” la ligne entrée par l’utilisateur.
S’il entre toto+tutu-velo-prout+avion.
Il va falloir faire le tri pour optimiser au mieux.

Mais je suis une merde en prog, alors si vous avez un truc valable, ça m’interresse.

fait un echo $sql apres $sql .= " ORDER BY id";

et claques directement la requete dans phpmy… je suis sur à 99% que ca vient de la.

ah et au lieu de mettre des ‘%$multi_chaine_search[$i]%’ mets plutot ‘%".$multi_chaine_search[$i]."%’

[edit] ah putain j’avions pas fait gaffe que ca cherchais le nom et la description. Bon il me faut le comportement exact:

Dis moi les résultats que ca doit te sortir si tu cherche, pour les termes “pomme orange” dans les textes suivants:

nom “pomme” description "pomme"
nom “fruit” description "pomme"
nom “orange” description "pomme"
nom “pomme orange” description "fruit"
nom “fruit” description “pomme orange”

parce que si ca doit se trouver indiféremment dans le corps ou dans la description, mais que tu dois avoir absolument les 2, je préconise:

for($i = 0; $i < sizeof($nouvelle_rech); $i++) { &nbsp;if($i!=(sizeof($nouvelle_rech)-1)) &nbsp; &nbsp;$sql .= " CONCAT(nom,description) LIKE '%".$multi_chaine_search[$i]."%' AND"; &nbsp;else &nbsp; &nbsp;$sql .= " CONCAT(nom,description) LIKE '%".$multi_chaine_search[$i]."%'"; }

Merci je vais tester ça de ce pas

Oui c’est ça en fait je recherche le mot clé dans le titre et dans le texte de l’article, d’où le OR

[quote name=’[PERE]Cil’ date=’ 10 Jan 2005, 17:39’]fait un echo $sql apres $sql .= " ORDER BY id";

et claques directement la requete dans phpmy… je suis sur à 99% que ca vient de la.

ah et au lieu de mettre des ‘%$multi_chaine_search[$i]%’ mets plutot ‘%".$multi_chaine_search[$i]."%’

[edit] ah putain j’avions pas fait gaffe que ca cherchais le nom et la description. Bon il me faut le comportement exact:

Dis moi les résultats que ca doit te sortir si tu cherche, pour les termes “pomme orange” dans les textes suivants:

nom “pomme” description “pomme” -> non
nom “fruit” description “pomme” -> non
nom “orange” description “pomme” -> oui
nom “pomme orange” description “fruit” -> oui
nom “fruit” description “pomme orange” -> oui[/quote]

En gros il ne doit trouver que les pages où y a à la fois pomme et orange, indifféremment du nom ou de la description

Avec ta solution [Pere]cil j’ai ça comme erreur :

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\program files\...\aff_result.php on line 62

Et la ligne 62 c’est :

$nb_results = mysql_num_rows($tab_requete[0]);

EDIT : autant pour moi je m’étais emmelé les pinceaux, il restait de smorceaux de l’ancien code c’est pour ça que ça faisait une erreur. J’ai fait quelques test ça a l’air de marcher nickel.

Un grand MERCI à tous ceux qui m’ont aidé :stuck_out_tongue: