C'est un petit code qui permet de créer une requête pour une recherche dans une table données.
On à trois options de recherche:
- Rechercher tous les mots (AND)
- Rechercher un des mots (OR)
- Phrase complète ("")
Il suffit de passer ensuite à la fonction la table, les champs de recherche, les infos à récupérer et le critère de classement...
Source / Exemple :
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 requête
function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
{
// option de recherche
$option = $_POST['option'];
// texte de recherche
$search = $_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);
Conclusion :
Ben voila, j'attends vos commentaires
16 juin 2009 à 15:38
The requested URL /search.php was not found on this server" je pense que je dois configurer quelque chose mais quoi ? la page de mon site ou le logiiel doit chercher ?? creer url/search.php.
je propose des jeux et j'aimerai que l'internaute trouve la page du jeu, demandé a la recherche
a l'aid svp chui un nul
15 mars 2009 à 12:30
Merci
29 mai 2008 à 17:33
néanmoins j'aurais besoin de vos avis vis a vis d'un soucis d'affichage pour un de mes codes : il se trouve que mes resultats de recherche sont affichés 4 fois et à la suite les uns des autre comment pourrais je faire pour resoudre ce soucis
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Résultats de la recherche</title>
<style TYPE= "text/css">
<!--
A:hover {text-decoration:none; background: #FFFFCC}
A:hover {color:#FF0000;}
-->
</style>
<style TYPE="text/css">
BODY {
scrollbar-face-color: #bfcfff;
scrollbar-shadow-color: #000000;
scrollbar-highlight-color: #FFFFFF;
scrollbar-3dlight-color: #000000;
scrollbar-darkshadow-color: #000000;
scrollbar-track-color: #e6cff;
scrollbar-arrow-color: #6078bf;
}
</style>
</head>
<center>
Résultats de la recherche</center>
<?php
$zone_fr=$_POST['zone_fr'];
$niveau=$_POST['niveau'];
$vent_opt=$_POST['vent_opt'];
$envoyer=$_POST['envoyer'];
if(isset($_POST['envoyer'])) $envoyer=$_POST['envoyer'];
else $envoyer="";
if ($zone_fr=="" && $niveau=="" && $vent_opt=="")
{echo "<center> Veuillez remplir au moins un champ!! </center>";}
elseif($envoyer == 'Recherche ')
{
echo' ' ;
echo'
';
echo'
';
if(isset($_POST['zone_fr'])) $zone_fr =$_POST['zone_fr'];
else $zone_fr= "";
if(isset($_POST['niveau'])) $niveau=$_POST['niveau'];
else $niveau="";
if(isset($_POST['vent_opt'])) $cms=$_POST['vent_opt'];
else $vent_opt="";
include("connectionkite.php");
$connect = connectToBasec();
;
$sql "SELECT DISTINCT zone.zone_fr,zone.spot,zone.ID_spot,session.sess_type,session.niveau,session.vent_opt FROM zone,info,session WHERE zone.ID_spot info.ID_spot and zone.zone_fr like '%$zone_fr%' and session.niveau like '%$niveau%' and session.vent_opt like '%$vent_opt%'";
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
$result="0";
//Test du résultat
while($data = mysql_fetch_assoc($req)){$result="1";}
//Affichage des données.
if ($result=="0"){
echo"<center> Aucun enregistement retourné ... </center>
";
}
else{
//affichage des données
echo'';
echo'----
';
echo'<center>zone</center>,
<center>spot</center>,
<center>niveau</center>, <center>type de session</center>, <center>Numeros</center>, <center>Détails</center>, ';
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
while($data=mysql_fetch_assoc($req))
{
$zone_fr=$data['zone_fr'];
$niveau=$data['niveau'];
$vent_opt=$data['vent_opt'];
$ID_spot=$data['ID_spot'];
echo'----
';
echo'<center>'.$data['zone_fr'].', </center>
<center>'.$data['spot'].', </center>
<center>'.$data['niveau'].', </center><center>'.$data['sess_type'].', </center><center>'.$data['ID_spot'].', </center>';
echo'';
echo" <center></center>";
echo', ';
}}
echo'
';
echo'
';
echo'
';
}
?>
</html>
15 mai 2008 à 18:15
Cette variable, statique, sert à n'effectuer une action de traitement sur les variables post envoyées que lors du premier appel de la fonction! :)
Raf
15 mai 2008 à 15:30
Tous d'abord merci pour la qualité de ton code!
Par contre je n'ai pas compris quoi sert la variable $fonction_requete?
Sinon chez moi dans ce bout de code la :
if(!$i)
{
$req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
$i = 1;
}
else
$req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
il faut enlever le OR de la dernière ligne sinon ça ne fonctionne pas.
Maintenant tous fonctionne bien mis à part le probleme de l'expression entière évoqué plus haut qui sort des résultats un peu bizare parfois...
Encore merci pour cette source vraiment sympa!
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.