Moteur de recherche avec plusieurs mots
biguiz
Messages postés
201
Date d'inscription
Statut
Membre
Dernière intervention
-
Yoskopolite Messages postés 83 Date d'inscription Statut Membre Dernière intervention -
Yoskopolite Messages postés 83 Date d'inscription Statut Membre Dernière intervention -
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);
?>
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:
- Moteur de recherche avec plusieurs mots
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Trousseau mot de passe iphone - Guide
- Retrouver un film avec des mots - Télécharger - Divers TV & Vidéo
- Mot de passe - Guide
- Copiez la ligne qui indique aux moteurs de recherche de ne pas référencer la page. ✓ - Forum Référencement
11 réponses
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 :
Ce qui, dans le cas d'une recherche sur poulet et coq, devrait donner une requête sql de cette forme :
Et là, il devrait retourner tous les enregistrement qu'il te faut
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
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...
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...
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é...
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é...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
au lieu de :
Il aurait fallut écrire :
$Requete0 = "SELECT num from " . $Nomtable . " WHERE";
au lieu de :
$Requete0 = "SELECT num from $Nomtable WHERE";
Oui oui, c'est normal, c'est la concaténation de la variable. Si on fait
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
$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
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);
?>
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);
?>
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 :
pour pouvoir sélectionner 1, 2 ET 3 il faut une requête de ce genre (avec des AND et des OR) :
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 :
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) :
[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 }
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 ?
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 ?
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.
Je crois qu'ils en parlent un peu dans ce poste, sur le forum : Petit moteur de recherche en PHP.