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
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
A voir également:
- Problème - moteur de recherche interne
- Safari moteur de recherche - Télécharger - Navigateurs
- Recherche musique - Guide
- Opera moteur de recherche - Télécharger - Navigateurs
- Google recherche par image - Guide
- Installer qwant moteur de recherche - Télécharger - Navigateurs
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
Par contre sans le LIKE % ça recherchera chacun des noms exacts
sinon tu mets des LIKE%.....% à la place des =
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 =
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
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+
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+
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....
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....
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
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+
<? ...
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+
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:
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(); ?>
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
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+
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+
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 ???
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 ???
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
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+
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+
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
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>';
}
}
}
...
...
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>';
}
}
}
...
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;
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
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+
a+