Problème - moteur de recherche interne

Résolu/Fermé
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 - 18 déc. 2007 à 14:43
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 - 19 déc. 2007 à 22:31
Bonjour,

j'ai créé un moteur de recherche interne sur mon site via une table sur MySQL (id, titre, description, mots-clés, priorités, url). Seulement, j'ai un problème...

Lors d'une recherche, par exemple : si le visiteur tape "camera pour le numérique" et que dans ma base donnée j'ai marqué en mots-clés "camera numérique", la page ne s'affichera pas dans les résultats. Tout simplement car lors de la recherche dans la base de donnée, MySQL effectue une recherche de l'expression exacte, de l'intégralité de l'expression, hors je souhaiterais que :

- dès qu'il y a "au moins" un mot-clé similaire à la recherche dans la base > le résultat s'affiche


Comment faire pour arriver à un tel résultat ? Quelqu'un a une idée ? Que dois-je utiliser comme fonction ? Voilà mon code actuel :

<? ...

if (($_POST["text"] == "")||($_POST["text"] == "%")) {
// Si aucun mot clé n'a été saisi,
// le script demande à l'utilisateur
// de bien vouloir préciser un mot clé

echo "Veuillez entrer un mot clé s'il vous plaît!<p>";

}

else {

//requête de recherche
$req = mysql_query("SELECT * from recherche where recherche_motscles LIKE '%$_POST[text]%' ORDER BY recherche_priority ASC ")
or die ("erreur req ".mysql_error());

//on compte les résultats
$res= mysql_numrows($req);

//on affiche le nombre de résultats trouvés
print 'Pour le mot '.$recherche.' il y\'a '.$res.' résultats <br>';

//----------------------------------------------------------------------
//on ressort les infos par ordres alphabétiques, voir order dans la requête

while( $sortie = mysql_fetch_array($req))
{

print '<br / >';
print '<font class="titre"><a href="'.$sortie['recherche_url'].'">'.$sortie['recherche_titre'].'</a></font><br / >';
print $sortie['recherche_description'].'<br /><br />';
print '<b><a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> Voire la page'.'</b></a><br /><hr>'; // c'est juste une ligne de séparation ;-)
}//fin de boucle

}
//on ferme la connexion
mysql_close();
?>



Merci d'avance pour vos conseils et votre aide!

a+
A voir également:

11 réponses

bonsoir,

tu fais un explode() de ta chaine par rapport à espace, cela te donnera un array avec tous les mots.

par une boucle tu parcours cet array et tu cree ta requette en ajoutant à chaque "tour" une condition OR

$array_chaine=explode(" ",$_POST[text]);

$query="SELECT * FROM recherche WHERE ";
for($i=0;$i<sizeof($array_chaine);$i++){
	if($i>0){$query.=" OR ";}
   $query.="recherche_motscles = '$array_chaine[$i]'";
}
$query.= " ORDER BY recherche_priority ASC ";

mysql_query($query);
//etc..



Par contre sans le LIKE % ça recherchera chacun des noms exacts

sinon tu mets des LIKE%.....% à la place des =
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
19 déc. 2007 à 03:07
Salut Alain, merci pour ta réponse, malheureusement y'a un truc que j'ai mal compris...

Qu'entends-tu par - " en ajoutant à chaque "tour" une condition OR " - ??? Je ne suis pas un as en php donc si tu pouvais m'aider juste encore un peu à bien comprendre la fonction car pour l'instant je bug sur un truc mais je ne vois pas que faire ??

Merci a+
0
Bonjour,

dans cette partie je t'ai fait:


$query="SELECT * FROM recherche WHERE "; // la on met le debut de la requette

for($i=0;$i<sizeof($array_chaine);$i++){ // ça c'est la boucle qui parcours tout l'array donc les mots un par un

if($i>0){$query.=" OR ";} // la a partir de la deuxieme condition on met le OR (OU)

$query.="recherche_motscles = '$array_chaine[$i]'"; la on met la premiere condition
}
$query.= " ORDER BY recherche_priority ASC "; // la on met la fin de la requette


$query.= sert a concatener c'est a dire on empile dans la variable à la suite

le principe de la requette sera de chercher toutes les lignes qui contiennent le mot 1 OU le mot 2 OU le mot 3 etc...

"SELECT * FROM recherche WHERE recherche_motscles=mot1 OR recherche_motscles=mot2 OR recherche_motscles=mot3 etc....
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
19 déc. 2007 à 12:06
Merci, c'est ce que j'avais globalement compris... Mais mon problème, c'est qu'il ne trouve jamais aucun résultat désormais, donc j'ai du faire une erreur quelque part, car la requête ne fonctionne pas correctement et je ne vois toujours pas d'où ça vient... Copier-coller du code source:

<? ...

if (($_POST["text"] == "")||($_POST["text"] == "%")) {

echo "Veuillez entrer un mot clé s'il vous plaît!<p>";

}

else {

$array_chaine=explode(" ",$_POST[text]);

$query="SELECT * FROM recherche WHERE ";
for($i=0;$i<sizeof($array_chaine);$i++){
if($i>0){$query.=" OR ";}
$query.="recherche_motscles = '$array_chaine[$i]'";
}
$query.= " ORDER BY recherche_priority ASC ";

$req = mysql_query($query)
or die ("erreur req ".mysql_error());

$res= mysql_numrows($req);

print 'Pour le mot '.$recherche.' il y\'a '.$res.' résultats <br>';

while( $sortie = mysql_fetch_array($req))
{

print '<br / >';
print '<font class="titre"><a href="'.$sortie['recherche_url'].'">'.$sortie['recherche_titre'].'</a></font><br / >';
print $sortie['recherche_description'].'<br /><br />';
print '<b><a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> Voire la page'.'</b></a><br /><hr>';
}

}

mysql_close();
?>

J'ai donc 0 résultats quelque soit les mots-clés entrés, est-ce que tu as une idée d'où ça vient ?? j'ai du faire une erreur au niveau des requêtes, si tu peux m'aider ??

Merci beaucoup a+
0

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

Posez votre question
qqs erreurs:

d'abord le tag php normalisé n'est pas <? mais <?php

erreur aussi mysql_numrows(..) c'est mysql_num_rows(...)

print 'Pour le mot '.$recherche.' il y\'a '.$res.' résultats <br>';
je ne vois pas ou est la variable $recherche

essayes comme ça, avec des echo:

<?php ...

if (($_POST["text"] == "")||($_POST["text"] == "%")) {

echo "Veuillez entrer un mot clé s'il vous plaît!<p>";

}

else {

$array_chaine=explode(" ",$_POST[text]);
//echo pour voir si on explode bien la chaine correctrement, tu dois avoir Array (0=> mot1  1=> etc..)
echo "<pre>";
print_r($array_chaine);
echo "</pre>";

$query="SELECT * FROM recherche WHERE ";
for($i=0;$i<sizeof($array_chaine);$i++){
if($i>0){$query.=" OR ";}
$query.="recherche_motscles = '$array_chaine[$i]'";
}
$query.= " ORDER BY recherche_priority ASC ";
// echo pour vois si la requette est correcte
echo "Requette generee: ".$query;

$req = mysql_query($query)
or die ("erreur req ".mysql_error());

$res= mysql_num_rows($req);

print 'Pour le mot '.$recherche.' il y\'a '.$res.' résultats <br>';

while( $sortie = mysql_fetch_array($req))
{

print '<br / >';
print '<font class="titre"><a href="'.$sortie['recherche_url'].'">'.$sortie['recherche_titre'].'</a>& lt;/font><br / >';
print $sortie['recherche_description'].'<br /><br />';
print '<b><a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> Voire la page'.'</b></a><br /><hr>';
}

}

mysql_close();
?> 
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
19 déc. 2007 à 14:52
Ok merci des conseils, je viens de tester...

Mais le problème de cette requête, c'est qu'elle recherche une cellule qui est strictement égale à la recherche. Par exemple, si je recherche "Cinema" et que dans mes mots-clés il y a "cinema stylo enceinte", elle ne va pas m'indiquer cette ligne, alors que c'est ce que je souhaite, afficher toutes les lignes qui contiennent un mot-clés de bon.

Et en mettant le "LIKE %...%"comme indiqué plus haut, la requête découpe l'intérieur des mots. Par exemple, si je tape en recherche "photo de roger" ça va rechercher tous les mots qui contiennent "photo" ou "de" ou "roger", et donc si dans mes mots-clés il y a "description" ça va s'afficher car ça contient "de", si il y a "photomontage" ca va s'afficher car ca contient "photo", etc... alors que les mots-clés ne sont pas exacts.

Est-ce qu'il existe une solution au problème ? Comment faire pour rechercher mot par mot, sans recherche une cellule exacte, ou sans découper l'intérieur des mots ? Comment font les autres moteurs de recherche ?


merci, a+
0
Alors tu ne mets pas LIKE mais =

et tu peux faire une recherche par pertinence, c'est à dire:

- tu fais une premiere recherche avec = "la chaine complete"

si pas de resultat:
- nouvelle recherche avec les premiers mots

si pas de resultat
_ nouvelle recherche avec explode et mot par mot et pour eviter de rechercher les "de" " la" etc..
tu peux tester le longueur du mot si <=2 tu ne rajoutes pas la condition dans la boucle

ce n'est qu'une piste de réflexion ???
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
19 déc. 2007 à 18:10
merci c'est effectivement une bonne idée, je viens d'appliquer à peu près ta proposition :

1- recherche avec la "chaine complète"
2- recherche "mot par mot"


à priori, ça ça marche, mais sur la 2e partie, j'aimerais comme tu le souligne faire un bis pour tester la longueur du mot et mettre de côté les mots inférieurs ou égaux à 3, comment faire ?

Il faut que j'utilise la fonction " strlen($i) " c'est bien ça?... Mais comment définir pour que chaque mot soit traité un par un pour savoir s'ils sont supérieur à 3, et que dire à ceux qui sont inférieur 3 pour les esquiver ? Je pense qu'il me manque encore quelque compétence pour élaborer ça de moi même sans aide... As-tu une idée ?


merci encore! a+
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
19 déc. 2007 à 18:13
je te marque le code source ce sera peut-être plus facile :


...
if (($_POST["text"] == "")||($_POST["text"] == "%")) {
echo "Veuillez entrer un mot clé s'il vous plaît!<p>";
}

else {


$req = mysql_query("SELECT * from recherche where recherche_motscles LIKE '%$_POST[text]%' ORDER BY recherche_priority ASC ")
or die ("erreur req ".mysql_error());

$res= mysql_num_rows($req);


if ($res>0) {

echo 'Pour le mot '.$recherche.' il y\'a '.$res.' résultats <br>';
while( $sortie = mysql_fetch_array($req))
{
echo '<br / >';
echo '<font class="titre"><a href="'.$sortie['recherche_url'].'">'.$sortie['recherche_titre'].'</a></font><br / >';
echo $sortie['recherche_description'].'<br /><br />';
echo '<b><a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> Voire la page'.'</b></a><br /><hr>';
}
}

else {

$array_chaine=explode(" ",$_POST[text]);
//echo pour voir si on explode bien la chaine correctrement, tu dois avoir Array (0=> mot1 1=> etc..)
echo "<pre>";
print_r($array_chaine);
echo "</pre>";

$query="SELECT * FROM recherche WHERE ";
for($i=0;$i<sizeof($array_chaine);$i++){
if($i>0){$query.=" OR ";}
$query.="recherche_motscles = '$array_chaine[$i]'";
}
$query.= " ORDER BY recherche_priority ASC ";
echo "Requette generee: ".$query;

$reqx = mysql_query($query)
or die ("erreur req ".mysql_error());

$res= mysql_num_rows($reqx);

echo 'Pour le mot '.$recherche.' il y\'a '.$res.' résultats <br>';

while( $sortie = mysql_fetch_array($reqx))
{

echo '<br / >';
echo '<font class="titre"><a href="'.$sortie['recherche_url'].'">'.$sortie['recherche_titre'].'</a></font><br / >';
echo $sortie['recherche_description'].'<br /><br />';
echo '<b><a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> Voire la page'.'</b></a><br /><hr>';
}

}

}

...
0
Deux lignes a rajouter dans cette partie là:

else {

	$array_chaine=explode(" ",$_POST[text]);
	//echo pour voir si on explode bien la chaine correctrement, tu dois avoir Array (0=> mot1 1=> etc..)
	echo "<pre>";
	print_r($array_chaine);
	echo "</pre>";

	$query="SELECT * FROM recherche WHERE ";
	for($i=0;$i<sizeof($array_chaine);$i++){
		if(strlen($array_chaine[$i])>2){ // on ne tient compte que des mots de plus de 2 lettres
			if($i>0){$query.=" OR ";}
			$query.="recherche_motscles = '$array_chaine[$i]'";
		}
	}
	$query.= " ORDER BY recherche_priority ASC ";
	echo "Requette generee: ".$query;
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
19 déc. 2007 à 22:31
Un énorme MERCI à toi Alain, j'ai bien testé, tout à l'air de fonctionner, et en plus je pense avoir pigé pas mal de trucs avec tes explications, génial !

a+
0