Moteur de recherche dans bdd

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 891 fois - Téléchargée 34 fois

Contenu du snippet

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

A voir également

Ajouter un commentaire

Commentaires

jeuxfree
Messages postés
2
Date d'inscription
mardi 16 juin 2009
Statut
Membre
Dernière intervention
16 juin 2009
-
salut je suis novice et j'ai simplement copier-coller et quand je cherche un mot j'ai "Not Found
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
cs_lanner
Messages postés
131
Date d'inscription
samedi 16 avril 2005
Statut
Membre
Dernière intervention
8 avril 2015
-
Salut, cela me semble pas mal mais serait possible d'avoir un exemple concret fichier php mis en place avec un petit exemple de slq à placer ? ce serait plus simple :)
Merci
cs_lepetitcod
Messages postés
4
Date d'inscription
lundi 28 mai 2007
Statut
Membre
Dernière intervention
3 juin 2008
-
bravo pour ce travail il m'a enormement inspiré !!!
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>
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Salut!
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
keogus
Messages postés
17
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
2 février 2010
-
Salut,

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.