Page 1 sur 1

moteur de recherche autocomplete

Posté : 18 déc. 2007, 10:31
par béka
Bonjour tout le monde.
Je développe une application dans laquelle j'ai inclu un moteur de recherche (champ input type="text").
Ce moteur de recherche permet de rechercher la présence d'une suite de caractères dans un mot.
Ce moteur de recherche suggère automatiquement (via AJAX et la librairie prototype.js) des résultats qui contiennent les caractères saisis.

Pour l'instant ce ci marche lorsque je recherche dans une seule table mais j'aimerais rendre ce script capable de faire une recherche dans plusieurs tables dans plusieurs champs et afficher ainsi le champ dans lequel on a trouvé le résultat qui correspond.

Voici pour l'instant le code que j'ai :
<?
$sql = array();
$sql = array(
      "SELECT" => "*",
      "FROM" => "`table`",
      "WHERE" => "`nom_champ` LIKE '%".$_POST['search']."%'"
      );
$sql = sql2string($sql);
$result = $db->query($sql);

?>
<ul>
<? 
$i = 0;
while ( $data = $result->fetchRow() ) { 
  echo '<li>'.stripslashes($data['nom_champ']).'</li>';
  $i++;
} ?>
</ul>
Pouvez vous alors me conseiller et m'aider sur comment faire ?

PS : J'utilise l'ensemble PEAR

Posté : 18 déc. 2007, 11:05
par Ryle
T'es bon pour faire une requête par table et concaténer tes résultats (ou faire X boucles pour les afficher à la suite)... Tu pourrais éventuellement jouer avec des "Union" pour ne faire qu'une seule requête, mais puisque tu utilises un SELECT * ça ne fonctionnera pas.

Et j'avoue que j'ai du mal à comprendre ta façon de construire des requêtes à partir d'un tableau et l'intérêt que cela peut avoir, à part te limiter dans tes possibilités ou alors avoir une usine à gaz dans sql2string() :-k

Posté : 18 déc. 2007, 11:28
par Berzemus
Et pour la taille des données, tu recherches dans des champs très limités en taille, ou simplement en texte ? Pasqu'alors, c'est bien plus pratique de passer par les capacités fulltext de mysql.

Posté : 18 déc. 2007, 11:37
par béka
Je pensais tout d'abord mettre dans un tableau mes différentes tables et les différents champs de ces tables.
<?
$fields = array(
            "table1" => array("champ1", "champ2", "champ3"),
            "table2"=> array("champ1", "champ2"),
            "table2" => array("champ1", "champ3")
);
?>
Et ensuite utiliser ce tableau pour construire ma requêtes de cette manière :
<?
foreach($fields as $key => $champs) {
      $sql = array();
      $sql['SELECT'] = "*";
      $sql['FROM'] = "`".$key."`";
  foreach($champs as $champs2) {
      $sql['WHERE'] = "`".$champs2."` LIKE '%".$_POST['search']."%'";
      $sql_string = sql2string($sql);
      //$result = $db->query($sql_string);
  }
}?>
Mais je ne sais pas si cette méthode est optimale.

L'utilité de construirte mes requêtes grâce à un tableau, est que la construction de la requête se fait de manière plus simple.
Ensuite avec la fonction sql2string j'en fais une requête toute simple (sans tableau).

Oui mes champs sont des champs limité en taille et peu volumineux. Je n'ai pas intérêt à utiliser full text

Posté : 19 déc. 2007, 14:51
par béka
Bonjour tout le monde,

j'ai arrangé mon problème pour en voir apparaitre un autre.

voici mon code qui me permet d'afficher des expressions qui correspondent à ce que recherche un utilisateur dans le moteur de recherche :
<?
$fields = array(            
            "table1" => array("champ1", "champ2", "champ3"),
            "table2" => array("champ4"),
            "table3" => array("champ5")
);

foreach($fields as $key => $champs) {
    $sql = array();
    $sql['SELECT'] = "*";
    $sql['FROM'] = "`".$key."`";
    foreach($champs as $champs2) {
        $sql['WHERE'] = "`".$champs2."` LIKE '%".$_POST['search']."%'";
        $string_sql = sql2string($sql);
        $result = $db->query($string_sql);
        $data = $result->fetchRow();
        echo "<ul>"; 
        if($data[$champs2] != '') {
          echo "<li>".stripslashes($data[$champs2]);
        }
        echo "</ul>";
    }
}
?>
Ceci me permet alors d'afficher sous le input une liste de mot qui contienne ce qu'est en train de taper l'utilisateur.
Seulement je note un problème. Je ne peux cliquer que sur le 1er élément listé pour le voir s'afficher dans le input.
De même si je cherche quelque chose qui se trouve dans table2, il ne s'affiche pas dans la liste sous le input.

Pourquoi? d'où peuvent provenir ces problèmes ?