[PHP & MySQL] Moteur de recherche dans BDD

Titre: Moteur de recherche dans BDD
Date: Août 2004
Language: PHP & MySQL
Description: Ce code permet de créer une requête MySQL afin d’effectuer une recherche dans une base de données.

Trois options existent:
– Rechercher tous les mots (AND)
– Rechercher un des mots (OR)
– Phrase complète («  »)

Formulaire:


<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>

Fonction de création de la requête:

<?php
function requete( $table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '' )
{
	// option de recherche
	$option = $_POST['option'];
	// texte de recherche
	$search = addslashes( $_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;
}
?>

Paramètres:
$table: table dans laquelle effectuer la requête
$champs: champs dans lesquels la recherche est effectuées (si plusieurs champs, $champs est un tableau)
$select: champs à récupérer
$order: champ de classement
$sens: ASC ou DESC
$limit_start: départ
$limit_nb: nombre d’enregistrements sélectionnés
$count: paramètre optionnel: Si est vide ou non-passé, la requête est crée normalement. Sinon, il désigne le champ pour créer la requête count()

En simplifé, la requête est générée comme ceci:
SELECT $champs FROM $table WHERE … ORDER BY $order $sens LIMIT $limit_start, $limit_nb

Exemple:
$requete = requete(‘table’, array(‘champ1’, ‘champ2’, ‘champ3’), ‘id, champ4’, ‘id’, ‘DESC’, 10, 25);
$result = mysql_query($requete);

Télécharger le zip avec un exemple: ici (1 fichier .php)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *