J'ai un moteur de recherche qui a comporte 3 options de recherche et qui recherche dans plusieurs champs:
-Tous les mots
-Un de ces mots
-L'expression exacte
Un script php fait vrarier la requete SQL suivant l'option cochée
voici un exemple de requête :
Code : Tout sélectionner
SELECT ref, auteur, titre, description, commentaire, prix FROM stock WHERE ( ref LIKE '%originale%' ) OR ( auteur LIKE '%originale%' ) OR ( titre LIKE '%originale%' ) OR ( description LIKE '%originale%' ) OR ( commentaire LIKE '%originale%' ) OR ( prix LIKE '%originale%' ) ORDER BY auteur ASC LIMIT 0, 10Mais je n'arrive pas a modifier le script.
Pouvez - vous m'aider ?
Merci
<?php
function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
{
// option de recherche
$option = $_GET['option'];
// texte de recherche
$search = $_GET['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;
}
?>