Vous êtes ici Codes PHP et MySQL > Recherches > [PHP5] Moteur de recherche II

 

[PHP5] Moteur de recherche II

Voilà, une petite classe permettant de générer une requête de recherche pour une bdd.
J'ai déjà fait un code similaire ; la raison pour laquelle je ne l'ai pas remplacé par celui-ci est que l'autre est une simple fonction, qui s'utilise peut-être plus facilement!

Celle-ci crée une requête plus efficace pour la recherche!
##############################33
Utilisation:
// création d'objet
$s = new dbSearch( $_POST['search_option'], $_POST['search_text'] );

/*
ici, recherche dans la table news
on récupère le champ id
la recherche se fait dans les champs titre et texte
classement selon id, desc
limit 0, 10
*/
$sql = $s->mkQuery( 'news', 'id', array( 'titre', 'texte' ), 'id', 'desc', 0, 10 )
/*
$sql['select'] // requête de select
$sql['count'] // requête de comptage
*/
?>

La fonction getQuery permet de récupérer la requête MySQL mais sans le LIMIT, utile si vous voulez faire un affichage page par page et que la recherche ne change pas.
 
R@f
[17] sources en PHP voir
Code vu 18821 fois
Enregistré le 24 Jan 2009
  • Digg ce code sur digg.com
  • Bookmark ce code sur del.icio.us
  • Bookmark ce code sur Google
  • Bookmark ce code sur Yahoo
  • Ajoute [PHP5] Moteur de recherche II
  • Partage ce code sur Facebook
 
 
 
 

Code Source


01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
 
<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : [PHP5] Moteur de recherche II                             */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts178-PHP.htm              */
/* Auteur         : R@f                                                       */
/* Date édition   : 24 Jan 2009                                               */
/*                                                                            */
/******************************************************************************/
?>
/* FORMULAIRE */
<form action="" method="post">
<input type="text" name="search_text" size="100" style="font-size: 12px;"
 value=""><br><br>
<input type="radio" name="search_option" value="all" style="border: none;
 font-size: 12px;" checked>Rechercher tous les mots<br>
<input type="radio" name="search_option" value="one" style="border: none;
 font-size: 12px;">Rechercher un de ces mots<br>
<input type="
radio" name="search_option" value="sentence" style="border: none; font-size:
 12px;">Rechercher l'expression exacte
    
<br><br>
<input type="submit" value="Rechercher" name="submit" style="font-size: 12px;
 position: relative; left: 20px;">
</form>

/* CLASS */
<?php
class dbSearch
{
  // mots et expressions à chercher
  private $words;
  
  // séparateur
  private $sep;
  
  // option de recherche
  private $option;
  
  // nombre de mots
  private $count_words;
  
  // clause where
  private $query_where '';
  
  /*
      __construct()
      Paramètres:
        - $search_option: option choisie
        - $search_text: texte de recherche entré
      Retour:
        void
  */
  public function __construct$search_option$search_text )
  {
    $this->query_prepared 1;
    
    // option de recherche
    $this->option $search_option;
    
    // recherche en ET
    if( $this->option  == 'all' )
    {
      $this->sep ' AND ';
      $this->option 1;
      $this->words explode' 'addslashes$search_text ) );
      $this->count_words count$this->words );
    }
    // recherche en OU
    else if( $this->option  == 'one' )
    {
      $this->sep ' OR ';
      $this->option 2;
      $this->words explode' 'addslashes$search_text ) );
      $this->count_words count$this->words );
    }
    // phrase exacte
    else
    {
      $this->option = ;
      $this->words[] = addslashes$search_text );
    }
  }
  
  /*
      mkQuery()
      Crée la requête MySQL
      Paramètres:
        - $table ( string ): table à utiliser 
        - $select ( string ): les champs que l'on récupère
        - $champs ( string si 1 champ, array si plusieurs ): champs dans
 lesquels s'effectue la recherche 
        - $order ( string ): critère de classement ; pas de classement si vide
        - $sens ( string: asc ou desc ): sens du classement 
        - $limit_start ( entier ): pour le LIMIT
        - $limit_nb ( entier ): pour le LIMIT ; si 0, pas de clause LIMIT
      Retour:
        void
  */
  public function mkQuery$table$select$champs$order$sens$limit_start
$limit_nb )
  {
    $this->query_where '';
    
    if( !is_array$champs ) )
      $champs = array( $champs );
      
    $count_champs count$champs );
    
    // si recherche en ET ou OU
    if( $this->option )
    {
      for( $i = ; $i $this->count_words$i++ ) // boucle sur les mots
      {
        // si pas première itération
        if( $i )
          $this->query_where .= $this->sep;
          
        $this->query_where .= '( ';
        
        for( $j = ; $j $count_champs$j++ ) // boucle sur les champs
        {
          if( $j )
            $this->query_where .= ' OR ';
            
          $this->query_where .= '`' $champs$j ] . '` LIKE \'%' $this->
words$i ] . '%\'';
          
        } 
// for( $j = 0; $j < $this->count_words; $j++ ) // boucle sur les champs
        
        $this->query_where .= ' )';
      } // for( $i = 0; $i < $count_champs; $i++ ) // boucle sur les mots
    }
    else // recherche phrase exacte
    {
      for( $i = ; $i $count_champs$i++ ) // boucle sur les champs
      {
        if( $i )
          $this->query_where .= ' OR ';
          
        $this->query_where .= $champs[$i] . ' LIKE \'%' $this->words[] . 
'%\' ';
      } // for( $i = 0; $j < $count_champs; $i++ ) // boucle sur les champs
    // else // recherche phrase exacte
    
    // construction de la requête finale
    $sql = array( 'select' => 'SELECT ' $select ' FROM ' $table ' WHERE ' $this->query_where'count' => 'SELECT count(*) FROM ' $table ' WHERE ' $this->query_where );
    
    if( !empty( $order ) )
      $sql['select'] .= ' ORDER BY ' $order ' ' $sens;
    $this->query_where $sql['select'];
    if( $limit_nb )
      $sql['select'] .= ' LIMIT ' $limit_start ', ' $limit_nb;
    
    return $sql;
  }
  
  /*
      getWhere()
      Récupération de la clause where
      Paramètres:
        void
      Retour:
        string
  */
  public function getQuery()
  {
    return $this->query_where;
  }
}

if( isset( $_POST['submit'] ) )
{
  $search $_POST['search_text'];
  
  $time_debut explode(' 'microtime());
  $time_debut $time_debut[1] + $time_debut[];
  
  $s = new dbSearch$_POST['search_option'], $_POST['search_text'] );
  
  $sql $s->mkQuery'news''id', array( 'titre''texte' ), 'id''desc', , 
10 );
  echo $sql['select'] . '<br /><hr />';
  
  $sql $s->mkQuery'gags''id', array( 'champ1''champ2''champ3' ), 'id',
 'asc', , 10 );
  echo $sql['select'] . '<br /><hr />';
}
else
  $search '';
  
?>

 

Fonctions du code

: Ajoute des antislashs dans une chaîne - (PHP 4, PHP 5)
: Coupe une chaîne en segments - (PHP 4, PHP 5)
: Compte le nombre d'éléments d'un tableau ou le nombre de propriétés...
: Détermine si une variable est un tableau - (PHP 4, PHP 5)
: Crée un tableau - (PHP 4, PHP 5)
: Détermine si une variable contient une valeur non nulle - (PHP 4, PHP 5)
: Détermine si une variable est affectée - (PHP 4, PHP 5)
: Retourne le timestamp UNIX actuel avec les microsecondes - (PHP 4, PHP 5)
: Affiche une chaîne de caractères - (PHP 4, PHP 5)
Commentaires
Est-ce qu'il y aurait moyen de faire un système de pagination avec ce système ?
Je l'utilise actuellement, sa fonctionne impec. mais j'aimerais pouvoir afficher plus que les 10 premiers résultats comme je le fais actuellement.
Si je met 100 sa risque de descendre très bas et je ne souhaite pas faire scroller les utilisateurs.
 

Il te faut utiliser un page par page :
http://www.phpsources.org/scripts-Affichage+page+par+page-PHP.htm
 
bonjour
je suis peu debutant
le /* CLASS */ est un code à mettre où, ou bien un fichier à créer??
merci
 
..dans le même fichier, c'est une classe car PHP est aussi orienté objet.
 
Svp j'ai une question vous allez la trouvez bizard , mais je veux un code source d'une application comme celle ci -(ajouter commentaire) qui permet de faire le traitement de texte + ajout des photo , c'est ci possible
 
Ajouter un commentaire
Code de sécurité

Attention: Les champs marqués d'une étoile * sont obligatoires
 
Librairie PHP

Connexion

 
 

Recherches

 
 

PHP

 
 
 
 
    Offres d'emploi

Plus de 500 offres d'emploi PHP/MySQL

Offres d'emploi
 
    Editeur PHP
 
        Publicité