Page 1 sur 1

petit souci moteur de recherche interne

Posté : 20 déc. 2009, 22:41
par graffx
Bonsoir tout le monde.

J' ai un petit souci, je me suis basé sur un tuto pour faire un moteur de recherche interne. Il est plutot simple mais il fonctionne bien a un detail prés. On ne peut mettre plus d' un mot clé, sous peine de n' avoir aucun résultat.

Je ne sais pas trop quoi faire pour remédier a ca, je vous montre le piti bout tout simple:
   <?
if(isset($_POST['requete']) && $_POST['requete'] != NULL) // on vérifie d'abord l'existence du POST et aussi si la requete n'est pas vide.
{

$requete = htmlspecialchars($_POST['requete']); // on crée une variable $requete pour faciliter l'écriture de la requête SQL, mais aussi pour empêcher les éventuels malins qui utiliseraient du PHP ou du JS, avec la fonction htmlspecialchars().
$query = mysql_query("SELECT * FROM annonces WHERE titre LIKE '%$requete%'
        OR annonce like '%$requete%'
        OR auteur like '%$requete%'
 		ORDER BY id DESC") or die (mysql_error()); // la requête, que vous devez maintenant comprendre ;)
$nb_resultats = mysql_num_rows($query); // on utilise la fonction mysql_num_rows pour compter les résultats pour vérifier par après
if($nb_resultats != 0) // si le nombre de résultats est supérieur à 0, on continue
{
// maintenant, on va afficher les résultats et la page qui les donne ainsi que leur nombre, avec un peu de code HTML pour faciliter la tâche.
?>
    </p>
      <h3 align="center">Résultats de votre recherche.</h3>
      <p>Nous avons trouvé <? echo $nb_resultats; // on affiche le nombre de résultats 
if($nb_resultats > 1) { echo ' résultats'; } else { echo ' résultat'; } // on vérifie le nombre de résultats pour orthographier correctement. 
?> dans notre base de données. Voici les fonctions que nous avons trouvées :<br/>
          <br/>
          <?
while($donnees = mysql_fetch_array($query)) // on fait un while pour afficher la liste des fonctions trouvées, ainsi que l'id qui permettra de faire le lien vers la page de la fonction
{
?>
          <a href="annonces_c.php?pseudo=<?php echo $_SESSION['pseudo']; ?>&id=<? echo $donnees['id']; ?>"><? echo $donnees['titre']; ?></a><br/>
          <?
} // fin de la boucle
?>
        <br/>
          <br/>
        <a href="rechercher.php">Faire une nouvelle recherche</a></p>
      <?
} // Fini d'afficher les résultats ! Maintenant, nous allons afficher l'éventuelle erreur en cas d'échec de recherche et le formulaire.
else
{ // de nouveau, un peu de HTML
?>
      <h3 align="center">Pas de résultats.</h3>
      <p align="center">Nous n'avons trouvé aucun résultat pour votre requête "<? echo $_POST['requete']; ?>". </p>
      <p align="center"><a href="annonces.php?pseudo=<?php echo $_SESSION['pseudo']; ?>">Réessayez</a> avec autre chose.</p>
      <p>
        <?
}// Fini d'afficher l'erreur ^^
mysql_close(); // on ferme mysql, on n'en a plus besoin
}
else
{ // et voilà le formulaire, en HTML de nouveau !
?>
        <?
}
// et voilà, c'est fini !
?>

Re: petit souci moteur de recherche interne

Posté : 21 déc. 2009, 13:40
par macgawel
Bonjour.
En fait, si tu veux accepter plus d'un mot clé, il faut :
1. Définir le fonctionnement (mot1 ET mot2, mot1 OU mot2, au choix, etc.)
2. Regarder le nombre de mots de ta requête.
3. Pour chaque mot, rajouter une clause à ta condition.
Optionnel, mais fortement conseillé : empêcher les requêtes sur plus de X mots, et sur des mots trop courts...
Pareil, faire une recherche avec des clause LIKE sur plusieurs champs, tu risques de te retrouver rapidement avec des requêtes très lourdes.
$separateur = ' '; // Par exemple. On peut forcer un autre séparateur, comme '+'.
$mots_cherches = explode($separateur, $requete); // On récupère un tableau des mots recherchés
$clause = ''; // On initialise la variable qui sert à récupérer la clause WHERE
foreach ($mot_cherches as $mot) { // On scanne les mots, pour contruire la clause WHERE
  if (!empty ( $clause)) { // => si on n'en est pas au premier mot
    $clause .= ' AND '; // Si on veut récupérer les annonces qui contiennent TOUS les mots...
  }
  $clause .= "(titre LIKE '%$mot%' OR annonce like '%$mot%' OR auteur like '%$mot%')"; // La requête à passer pour un mot
}
$query = mysql_query("SELECT * FROM annonces WHERE $clause;") or die (mysql_error()); // la requête, que vous devez maintenant comprendre
Autres problèmes à gérer :
- Majuscules/minuscules (si je cherche toto, il faut que je récupère l'annonce "Toto passe une annonce")
- Accents.
- (Dans l'idéal) fautes.

Re: petit souci moteur de recherche interne

Posté : 22 déc. 2009, 21:49
par graffx
Merci a toi je compris le principe, ca fonctionne pas mal du tout!!!

Il y a un petit hic, j' ai fait un lien sur l' id de l' article trouvé concerné, par exemple je cherche "peluche", il me trouve trois titres d' annonces dont l' annonce entiere (titre, contenu, auteur, etc) contient peluche, il y a un lien sur les resultat et lorsqu' on clic pour acceder a l' annonce, le chargement est super lent! A quoi cela peu-il etre du?

SI je vais voir les annonces sans le moteur de recherches, c' est par contre trés rapide, qu' est ce qui pourrait causer cette lenteur, ta solution n' a pourtant pas l' air trés lourde, si?

Re: petit souci moteur de recherche interne

Posté : 23 déc. 2009, 13:51
par macgawel
Si c'est uniquement quand tu cliques sur le lien, ça ne concerne pas a priori ce script.
Il faudrait voir du côté du script qui affiche l'annonce à partir de la page de recherche, s'il est différent du script "direct".