Recherche plusieurs mots clés

Fermé
alibi74 Messages postés 8 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 12 février 2010 - 11 févr. 2010 à 10:20
asmaanoor Messages postés 73 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 20 janvier 2014 - 20 oct. 2012 à 15:27
Bonjour,

je bosse sur le moteur de recherche de mon site et je rencontre quelques problèmes.
Je m'explique:

je souhaite que ce moteur puisse rechercher plusieurs mots clés. J'ai donc ces lignes de codes:

//...
$mot = ( $_POST['mot'] );
// Extraction des mots clefs
$mots = explode( " ", $mot );
if( count( $mots ) > 0 ) {
//
$query = "SELECT * FROM table WHERE ";
for( $i = 0; $i < count( $mots ); $i++ ) {
$query .= "titre LIKE '%". $mots[$i] ."%' OR contenu LIKE '%". $mots[$i] ."%'";
if( $i < count( $mots ) - 1 )
$query .= " OR ";
}
$query .= " ORDER BY date ASC";
$reponse = mysql_query( $query ) or die( mysql_error() );

Mon problème est que lors d'une recherche avec 2 mots clés par exemple, il me renvoi même les articles contenant un seul des mots clés contenu dans la requète. Comme l'affichage se fais par date ASC, l'affichage des resultats ne me convient pas du tout.

Quelqu'un a t-il une idée ? Merci d'avance.
A voir également:

6 réponses

scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
11 févr. 2010 à 10:24
C'est normal qu'il te retourne les trucs avec un seul des mots clés car tu fait :

LIKE "%ceci%"
OR
LIKE "%cela%"

Donc en gros tu demande qu'il contient soit ceci, soit cela, soit les deux.

Si tu veux qu'il contienne les deux tu dois faire :
LIKE "%ceci%"
AND
LIKE "%cela%"

Par contre entre le titre et le contenu je te conseille de garder un OR

Tu peux utilise des parenthèses aussi, donc au final ça te donnera en simplifier qqch comme ceci :

WHERE (titre LIKE "%ceci%" OR contenu LIKE "%ceci%")
AND (titre LIKE "%cela%" OR contenu LIKE "%cela%")
AND (titre LIKE "%autre%" OR contenu LIKE "%autre%")


0
alibi74 Messages postés 8 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 12 février 2010
11 févr. 2010 à 10:44
ok donc si je comprend bien il va falloir que je code afin de dissocier chaque mot de la requête genre $mots1, $mots2....c'est bien cela ?

Je cherche mais je n'arrive pas a integrer le AND dans ma requète. Merci quand même.
0
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
11 févr. 2010 à 14:00
bah tu as déjà mis le OR ^^
0
alibi74 Messages postés 8 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 12 février 2010
12 févr. 2010 à 00:28
Bon ben j'ai retravaillé mon code mais il me met un "parse error" pour la ligne que j'ai soulignée...j'suis encore loin d'être un expert en php donc la je craque...


//...
$mot = ( $_POST['mot'] );
// Extraction des mots clefs
$mots = explode( " ", $mot );
$i = count( $mots )
{

$query = "SELECT * FROM table WHERE ";
for( $i = 0; $i < count( $mots ); $i++ )
{
$query .= "titre LIKE '%". $mots[0] ."%' OR contenu LIKE '%". $mots[0] ."%' ";
"AND titre LIKE '%". $mots[1] ."%' OR contenu LIKE '%". $mots[1] ."%' ";
}
$query .= " ORDER BY date ASC";
$reponse = mysql_query( $query ) or die( mysql_error() );
}
0

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

Posez votre question
Hydror34 Messages postés 1 Date d'inscription vendredi 19 octobre 2012 Statut Membre Dernière intervention 19 octobre 2012
19 oct. 2012 à 14:23
$query = "AND titre LIKE '%". $mots[0]."%' AND titre LIKE '%". $mots[1]."%'";
0
asmaanoor Messages postés 73 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 20 janvier 2014 18
Modifié par asmaanoor le 20/10/2012 à 15:41
Assalamo 3laykom,

je pense que j'ai bien adapté ton code


$mot = ( $_POST['mot'] );
// Extraction des mots clefs
$mots = explode( " ", $mot );
$i = count( $mots );


$query = "SELECT * FROM table WHERE ";
for( $i = 0; $i < count( $mots ); $i++ ){
if($i==0)
{
$query .= "(titre LIKE '%$mots[$i]%' OR contenu LIKE '%$mots[$i]%') ";

}
else{
$query .="AND (titre LIKE '%$mots[$i]%' OR contenu LIKE '%$mots[$i]%' ) ";
}
}
$query .= " ORDER BY date ASC";

Bon courage ;)
0