Moteur de recherche avec plusieurs mots

Fermé
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 - 29 juil. 2008 à 14:51
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 - 30 juil. 2008 à 15:32
Bonjour,
Je possède actuellement un moteur de recherche sur mon site, mais lorsque l'on tape plusieurs mots, il est rare qu'il affiche les résultats correspondants (il n'affiche rien). J'ai testé plusieurs solutions mais le problème persiste. Merci par avance de votre aide...

Voici mon formulaire sur la page accueil :

<form action="rub/search/index.php" method="get" name="rechercher">
<input type="text" name="mot" size="19" border="0" value="Votre mot..." onFocus="javascript:this.value='';"><input type="image" src="images/bouton_vert.jpg" align="absmiddle" border="0">
</form>



Et voici ma requête d'affichage des résultats sur la page "recherche" :

<?php

//recuperation des Post ou Get
foreach($_REQUEST as $key => $value) {
$$key = $value;
}

$Hote = "hote";
$Utilisateur = "utilisateur";
$Motdepasse = "mot de passe";
$Nombase = "nom base";
$Nomtable = "nom table";

//ouverture base totale
mysql_connect ($Hote, $Utilisateur, $Motdepasse);
$mot = addslashes($mot);
$Requete0 = "SELECT num from $Nomtable WHERE nom LIKE '%$mot%' OR descriptif LIKE '%$mot%'";
$Resultat0 = mysql_db_query ($Nombase, $Requete0);


//comptage
$Nbe = mysql_num_rows($Resultat0);
?>
A voir également:

11 réponses

Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
29 juil. 2008 à 15:28
Ok.

Comme je le pensais, ta variable $mot vaudra donc "poulet+coq", et dans aucun de tes champs il ne trouvera "poulet+coq"
Tu va avoir besoin de faire un explode :
$tab=explode("+",$mot)

$Requete0 = "SELECT num from $Nomtable WHERE"; 

for($i=0;$i<sizeof($tab);$i++)
{
  $Requete0 = $Requete0 . " (nom LIKE '%" . $tab[$i] . "%' OR descriptif LIKE '%" . $tab[$i] . "%')"; 
  
  if ($i<sizeof($tab))
  {
    $Requete0 = $Requete0 . " AND";
  }
}


Ce qui, dans le cas d'une recherche sur poulet et coq, devrait donner une requête sql de cette forme :

SELECT num from $Nomtable WHERE (nom LIKE '%poulet%' OR descriptif LIKE '%poulet%') AND (nom LIKE '%coq%' OR descriptif LIKE '%coq%')


Et là, il devrait retourner tous les enregistrement qu'il te faut
1
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
29 juil. 2008 à 15:04
Bonjour,

Si j'ai bien compris, la variable $mot contient le texte tapé dans la recherche ?
Mais dans ce cas, si l'utilisateur effectue une recherche sur plusieurs mots, la variable contiendra cette suite de mot (ex : "poulet coq")

Si tu fait ta requête comme ça, il va recherche tous les endroits où on trouve la chaine "poulet coq" en entier.
Je suppose que tu préfèrerais une recherche sur tous les textes contenant les mots "poulet" ET/OU "coq", PAS FORCEMENT l'un derrière l'autre... ?

Dans ce cas, il te faudrait découper ta chaine de caractère en un tableau contenant chaque mot séparément et effectuer une recherche sur chaque mot...
0
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
29 juil. 2008 à 15:15
En fait si je tape comme mots clés de recherche "poulet coq", l'url de la page "recherche" est http://www.monsite.com/recherche.php?mot=pouler+coq

Et je voudrais dans mon cas que cela m'affiche les résultats contenant poulet ET coq, et pas forcément à la suite effectivement puisque ces mots peuvent se trouver dans le titre et la description.

Or dans mon cas cela ne m'affiche rien, alors que si je tape un seul mot ça m'affiche correctement les résultats du mot recherché...
0
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
29 juil. 2008 à 15:52
Parse error sur cette ligne :

$Requete0 = "SELECT num from $Nomtable WHERE";
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
29 juil. 2008 à 15:56
Effectivement, c'est une faute (mais en même temps ce n'est qu'un copié/collé du code que tu as indiqué plus haut...

Il aurait fallut écrire :
$Requete0 = "SELECT num from " . $Nomtable . " WHERE"; 

au lieu de :
$Requete0 = "SELECT num from $Nomtable WHERE"; 
0
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
29 juil. 2008 à 16:04
Toujours la même erreur...
Est-ce normal que dans votre code il y est $requete0=$requete0........
0
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
29 juil. 2008 à 16:17
Oui oui, c'est normal, c'est la concaténation de la variable. Si on fait
$var = "texte1"
$var = $var . "texte2"

la variable vaudra alors "texte1texte2"

En tout cas je ne sais pas trop pourquoi tu obtiens toujours un message d'erreur, mais si je dois te conseiller un tuto pour faire ce moteur de recherche, en voici un qui utilise la même méthode : Tuto moteur de recherche sur le site du Zér0
0
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
29 juil. 2008 à 19:24
Merci bien pour l'aide en tout cas.

Je revois ça demain au boulot ^^
0
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
30 juil. 2008 à 09:51
Voici ce que j'ai fait.
Le problème dans mon cas c'est que cela cherche dans 2 champs de ma table. Or dans les faits cela m'affiche les résultats dans un champs ou dans l'autre, pas le résultat en comptabilisant les 2 champs comme s'il n'y en avait qu'un... Par exemple si je tape "poule coq", ça va me trouver les résultats uniquement si ces 2 mots sont dans le même champs, pas si chaque mot est dans un champ différent de ma table...


<?php

$mots = explode(' ', $mot); //séparation des mots de la recherche à chaque espace
$nombre_mots = count ($mots); //compte le nombre de mots

$valeur_requete = '';
for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant la variable $nombre_mots_boucle de 1 à chaque fois
{
$valeur_requete .= 'AND nom LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
}
$valeur_requete = ltrim($valeur_requete,'AND'); //suppression de AND au début de la boucle

$valeur_requete2 = '';
for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++)
{
$valeur_requete2 .= 'AND descriptif LIKE \'%' . $mots[$nombre_mots_boucle] . '%\'';
}
$valeur_requete2 = ltrim($valeur_requete2,'AND');


$Hote = "hote";
$Utilisateur = "utilisateur";
$Motdepasse = "motdepasse";
$Nombase = "nombase";
$Nomtable = "nomtable";

//ouverture base totale
mysql_connect ($Hote, $Utilisateur, $Motdepasse);
$mot = addslashes($mot);
$Requete = "SELECT * from $Nomtable WHERE $valeur_requete AND $valeur_requete2";
$Resultat = mysql_db_query ($Nombase, $Requete);


//comptage
$compte = mysql_num_rows($Resultat);

?>
0
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
30 juil. 2008 à 13:35
prenons comme exemple cette liste d'enregistrement en table :
[num] - [nom] - [descriptif]
1 - [j'aime le poulet et le coq] - [blablabla]
2 - [blablabla] - [j'aime le poulet et le coq]
3 - [j'aime le poulet] - [j'aime le coq]
4 - [j'aime le poulet] - [blablabla]
5 - [blablabla] - [j'aime le poulet]
6 - [blablabla] - [blablabla]

ton code donne une requête qui ne sélectionne que 1 et 2 :
SELECT num from $Nomtable WHERE 
	nom LIKE '%poulet%' 
	AND nom LIKE '%coq%' 
	AND descriptif LIKE '%poulet%' 
	AND descriptif LIKE '%coq%'


pour pouvoir sélectionner 1, 2 ET 3 il faut une requête de ce genre (avec des AND et des OR) :
SELECT num from $Nomtable WHERE 
	(nom LIKE '%poulet%' OR descriptif LIKE '%poulet%') 
	AND (nom LIKE '%coq%' OR descriptif LIKE '%coq%')


si tu veux aussi sélectionner les n°4 et 5 (qui ne contiennent qu'un seul des deux mots), il te faut une requête avec uniquement des OR :
SELECT num from $Nomtable WHERE 
	nom LIKE '%poulet%' OR descriptif LIKE '%poulet%'
	OR nom LIKE '%coq%' OR descriptif LIKE '%coq%'


Ce qui semble t'intéresser est la seconde proposition. Tu n'as plu qu'à gérer le code qui créer cette requête (mais ça correspond déjà au code que je proposais dans mon premier poste)
Tu n'as donc besoin que d'une seule boucle FOR, mais qui ajoute le "nom LIKE xxx" ET le "descriptif LIKE xxx"

Ce qui donn (APPROXIMATIVEMENT) :
{
$valeur_requete .= 'AND (nom LIKE \'%' . $mots[$nombre_mots_boucle] . '%\' OR descriptif LIKE \'%' . $mots[$nombre_mots_boucle] . '%\')'; //modification de la variable $valeur_requete
} 
0
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
30 juil. 2008 à 14:20
Super ça marche merci beaucoup !!!

Par contre un autre problème c'est que la requête va marcher si j'écris "chevre" mais pas si j'écris "chèvre" avec un accent. Comment convertir les caractères accentués en non-accentués ?

Je suppose que c'est avec un htmlentities ou truc dans le genre, mais où le mettre ?
0
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
30 juil. 2008 à 15:08
là je suis désolé, mais je m'y connais pas trop sur ce point-ci... il faudrait faire en sorte que ta recherche ne soit pas "sensible à la casse", mais je n'ai aucune idée de comment faire...

Je crois qu'ils en parlent un peu dans ce poste, sur le forum : Petit moteur de recherche en PHP.
0
biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
30 juil. 2008 à 15:12
OK
Merci infiniment pour ton aide et ton temps. Je débute dans le métiers et parfois je patauge, mais c'est grâce à des gens comme toi que je peux progresser et mieux comprendre... ^^


Adishatz !
0
Yoskopolite Messages postés 83 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 9 novembre 2012 8
30 juil. 2008 à 15:32
Ca fait plaisir à entendre. :-)

N'hésite pas à indiquer les messages qui le mieux répondu à tes questions (en cliquant sur le bouton en forme de main avec le pouce levé, à gauche du message)
0