Moteur de recherche dans bdd ii

Contenu du snippet

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!

Source / Exemple :


/* Formulaire de recherche */
<form action="index.php" 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>

/* Classe */
<?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 = 0; $this->words[0] = 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 = 0; $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 = 0; $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 = 0; $i < $count_champs; $i++ ) // boucle sur les champs { if( $i ) $this->query_where .= ' OR '; $this->query_where .= $champs[$i] . ' LIKE \'%' . $this->words[0] . '%\' '; } // 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; } } ?>

Conclusion :


Exemple de fonctionnement:
<?php
// 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.

Voilà, j'attends vos commentaires

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.