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