Page 1 sur 1

moteur de recherche defectueux

Posté : 08 déc. 2010, 11:09
par Yadutonus
bonjour, je suis débutant en php.
J'essaie de faire fonctionner un script de moteur de recherche. Ma BDD de livres " ref, auteur, titre, description, commentaire, prix"
lorsque je fais un rechercher, elle ne se fait que dans le champs commentaire et description, et en plus seulement partiellement ( des livres ne sont pas pris en compte).
Pourriez vous m'aidez merci.

le formulaire

Code : Tout sélectionner

<form action="search.php" method="post"> <input type="text" name="search" size="100" style="font-size: 12px;"><br><br> <input type="radio" name="option" value="all" style="border: none; font-size: 12px;" checked>Rechercher tous les mots<br> <input type="radio" name="option" value="one" style="border: none; font-size: 12px;">Rechercher un de ces mots<br> <input type="radio" name="option" value="sentence" style="border: none; font-size: 12px;">Rechercher l'expression exacte <br><br> <input type="submit" value="Rechercher" style="font-size: 12px; position: relative; left: 20px;"> </form>

la fonction de recherche:
<?php function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
   {
   // option de recherche
   $option = $_POST['option'];
   // texte de recherche
   $search = $_POST['search'];
  
   // si c'est le premier appel de la fonction
   if(!isset($fonction_requete))
   {
   static $fonction_requete = 1;
  
   // si "Rechercher tous les mots" ou "Rechercher un de ces mots"
   if($option == 'all' || $option == 'one')
   {
   // liste des mots
   $mots = explode(' ', $search);
  
   // sépararateur
   if($option == 'all')
   $sep = ' AND ';
   else
   $sep = ' OR ';
   } // if($option == 'all' || $option == 'one')
   // "Rechercher l'expression exacte"
   else
   {
   $mots = $search;
   $sep = '';
   }
   } // if(!isset($fonction_requete))
  
   if(!is_array($champs))
   $champs = array($champs);
  
   if($option == 'all' || $option == 'one')
   {
   // pour savoir si on en est à la première itération ou non
   $i = 0;
  
   // pour tous les mots
   foreach($mots as $mot)
   {
   if(!$i)
   {
   $search = '~  ^!|!^  ~ LIKE \'%' . $mot . '%\'';
   $i = 1;
   }
   else
   $search .= $sep . '~  ^!|!^  ~ LIKE \'%' . $mot . '%\'';
   } // foreach($mots as $mot)
   } // if($option == 'all' || $option == 'one')
   else if($option == 'sentence')
   $search = '~  ^!|!^  ~ LIKE \'%' . $mots . '%\'';
  
   $i = 0;
  
   // début de requête
   if(empty($count))
   $req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ';
   else
   $req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ';
  
   // ajout des champs
   foreach($champs as $champ)
   {
   if(!$i)
   {
   $req_search .= '( ' . str_replace('~  ^!|!^  ~', $champ, $search) .' ) ';
   $i = 1;
   }
   else
   $req_search .= 'OR ( ' . str_replace('~  ^!|!^  ~', $champ, $search) .' ) ';
   }
  
   if(empty($count))
   $req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";
  
   return $req_search;
   } 
   
   
  
   
  try
{
	// On se connecte à MySQL
	$bdd = new PDO('mysql:host=XXXXX;dbname=XXXXX', 'XXXXX', 'XXXXX');
}
catch(Exception $e)
{
	// En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}

$table= 'stock' ;
$champs= array('ref','auteur','titre', 'description','commentaire','prix');
$select= 'ref, auteur, titre, description, commentaire, prix';
$order='ref';
$sens= 'DESC';
$limit_start = 1;
$limit_nb=25;
# $count: paramètre optionnel: Si est vide ou non-passé, la requête est crée normaleme


  $requete = requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb); 
   $result = $bdd->query($requete); 
   
   
   
   ?>

le fonction d'affichage:
<?php



// On affiche chaque entrée une à une
while ($donnees = $result->fetch())
{
?>

<?php

$image="images_stock/".$donnees['ref']."_1.jpg";
	if (file_exists($image)) 
  {
   $imageOK=$image;
  
  }
  else 
  {
   $imageOK="images_stock/no_image.jpg";
   
 	}

?>

         <li>
         
          <div class="block">

              <a href="#"><img src="<?php echo $imageOK;?>"alt=""  /></a>
                <h2><a href="#"> <?php echo $donnees['auteur']; ?></a></h2> 
                
            <h3><?php echo $donnees['titre']; ?></h3>
            <p><?php echo $donnees['description']; ?></p> 
                <p><?php echo $donnees['commentaire']; ?></p> 
                <p><?php echo $donnees['prix']; ?></p> 
            
            
           </div>
        </li> 
       <?php
}

$result->closeCursor(); // Termine le traitement de la requête

?>

Merci encore

Re: moteur de recherche defectueux

Posté : 08 déc. 2010, 12:45
par ouckileou
Salut

j'ai remplacé les balises "code" par "php", essaie d'y penser la prochaine fois.

Il faudrait nous montrer le SQL généré, comme indiqué dans ce message : sql-bases-donnees/php-sql-etapes-suivre ... 19378.html

D'ailleurs à ta place, je ferai des essais uniquement en SQL, dans phpMyAdmin par exemple, et une fois que tu as un modèle de requête qui fonctionne, tu l'intègre dans ton code PHP.

Re: moteur de recherche defectueux

Posté : 08 déc. 2010, 18:23
par Berzemus
Juste pour mettre mon petit grain de sable, "LIKE" n'est pas une fonction de recherche, mais de comparaison (Pas de recherche booléenne, pas de recherche floue, pas de score de correspondance, etc etc etc etc...).

Étudie les fonctions MATCH()... AGAINST() de Mysql et toute la recherche FullText qu'il sous-entend pour voir le vrai moteur de recherche intégré à MySQL.

Re: moteur de recherche defectueux

Posté : 09 déc. 2010, 09:30
par yadutonus
Merci pour ta réponse.

Voici donc ce qu'affiche echo $requete; : avec le mot clef "originale "


SELECT ref, auteur, titre, description, commentaire, prix FROM stock WHERE ( ref LIKE '%originale%' ) OR ( auteur LIKE '%originale%' ) OR ( titre LIKE '%originale%' ) OR ( description LIKE '%originale%' ) OR ( commentaire LIKE '%originale%' ) OR ( prix LIKE '%originale%' ) ORDER BY ref DESC LIMIT 1, 25

Re: moteur de recherche defectueux

Posté : 09 déc. 2010, 13:15
par ouckileou
Ok, et donc ? ça marche dans phpMyAdmin, tu as les résultats que tu veux ?

Berzemus a aussi fait une remarque...