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
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
A voir également:
- Moteur de recherche avec plusieurs mots
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Moteur de recherche sans censure - Accueil - Services en ligne
- Identifiants et mots de passe - Guide
- Recherche adresse - Guide
- Voir mot de passe wifi android - Guide
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
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 :
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
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
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...
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...
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
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é...
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é...
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
29 juil. 2008 à 15:52
Parse error sur cette ligne :
$Requete0 = "SELECT num from $Nomtable WHERE";
$Requete0 = "SELECT num from $Nomtable WHERE";
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
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 :
au lieu de :
Il aurait fallut écrire :
$Requete0 = "SELECT num from " . $Nomtable . " WHERE";
au lieu de :
$Requete0 = "SELECT num from $Nomtable WHERE";
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
29 juil. 2008 à 16:04
Toujours la même erreur...
Est-ce normal que dans votre code il y est $requete0=$requete0........
Est-ce normal que dans votre code il y est $requete0=$requete0........
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
29 juil. 2008 à 16:17
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
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
29 juil. 2008 à 19:24
Merci bien pour l'aide en tout cas.
Je revois ça demain au boulot ^^
Je revois ça demain au boulot ^^
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
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);
?>
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);
?>
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
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 :
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 }
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
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 ?
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 ?
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
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.
Je crois qu'ils en parlent un peu dans ce poste, sur le forum : Petit moteur de recherche en PHP.
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
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 !
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 !
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
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)
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)