Moteur de recherche dans bdd ii

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 822 fois - Téléchargée 26 fois

Contenu du snippet

Voilà, une petite classe permettant de générer une requête de recherche pour une bdd.
J'ai déjà fait un code similaire ; la raison pour laquelle je ne l'ai pas remplacé par celui-ci est que l'autre est une simple fonction, qui s'utilise peut-être plus facilement!

Celle-ci crée une requête plus efficace pour la recherche!

Source / Exemple :


/* Formulaire de recherche */
<form action="index.php" method="post">
<input type="text" name="search_text" size="100" style="font-size: 12px;" value=""><br><br>
<input type="radio" name="search_option" value="all" style="border: none; font-size: 12px;" checked>Rechercher tous les mots<br>
<input type="radio" name="search_option" value="one" style="border: none; font-size: 12px;">Rechercher un de ces mots<br>
<input type="radio" name="search_option" value="sentence" style="border: none; font-size: 12px;">Rechercher l'expression exacte
		
<br><br>
<input type="submit" value="Rechercher" name="submit" style="font-size: 12px; position: relative; left: 20px;">
</form>

/* Classe */
<?php
class dbSearch
{
	// mots et expressions à chercher
	private $words;
	
	// séparateur
	private $sep;
	
	// option de recherche
	private $option;
	
	// nombre de mots
	private $count_words;
	
	// clause where
	private $query_where = '';
	
	/*
			__construct()
			Paramètres:
			  - $search_option: option choisie
				- $search_text: texte de recherche entré
			Retour:
				void

  • /
public function __construct( $search_option, $search_text ) { $this->query_prepared = 1; // option de recherche $this->option = $search_option; // recherche en ET if( $this->option == 'all' ) { $this->sep = ' AND '; $this->option = 1; $this->words = explode( ' ', addslashes( $search_text ) ); $this->count_words = count( $this->words ); } // recherche en OU else if( $this->option == 'one' ) { $this->sep = ' OR '; $this->option = 2; $this->words = explode( ' ', addslashes( $search_text ) ); $this->count_words = count( $this->words ); } // phrase exacte else { $this->option = 0; $this->words[0] = addslashes( $search_text ); } } /* mkQuery() Crée la requête MySQL Paramètres: - $table ( string ): table à utiliser - $select ( string ): les champs que l'on récupère - $champs ( string si 1 champ, array si plusieurs ): champs dans lesquels s'effectue la recherche - $order ( string ): critère de classement ; pas de classement si vide - $sens ( string: asc ou desc ): sens du classement - $limit_start ( entier ): pour le LIMIT - $limit_nb ( entier ): pour le LIMIT ; si 0, pas de clause LIMIT Retour: void
  • /
public function mkQuery( $table, $select, $champs, $order, $sens, $limit_start, $limit_nb ) { $this->query_where = ''; if( !is_array( $champs ) ) $champs = array( $champs ); $count_champs = count( $champs ); // si recherche en ET ou OU if( $this->option ) { for( $i = 0; $i < $this->count_words; $i++ ) // boucle sur les mots { // si pas première itération if( $i ) $this->query_where .= $this->sep; $this->query_where .= '( '; for( $j = 0; $j < $count_champs; $j++ ) // boucle sur les champs { if( $j ) $this->query_where .= ' OR '; $this->query_where .= $champs[ $j ] . ' LIKE \'%' . $this->words[ $i ] . '%\''; } // for( $j = 0; $j < $this->count_words; $j++ ) // boucle sur les champs $this->query_where .= ' )'; } // for( $i = 0; $i < $count_champs; $i++ ) // boucle sur les mots } else // recherche phrase exacte { for( $i = 0; $i < $count_champs; $i++ ) // boucle sur les champs { if( $i ) $this->query_where .= ' OR '; $this->query_where .= $champs[$i] . ' LIKE \'%' . $this->words[0] . '%\' '; } // for( $i = 0; $j < $count_champs; $i++ ) // boucle sur les champs } // else // recherche phrase exacte // construction de la requête finale $sql = array( 'select' => 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ' . $this->query_where, 'count' => 'SELECT count(*) FROM ' . $table . ' WHERE ' . $this->query_where ); if( !empty( $order ) ) $sql['select'] .= ' ORDER BY ' . $order . ' ' . $sens; $this->query_where = $sql['select']; if( $limit_nb ) $sql['select'] .= ' LIMIT ' . $limit_start . ', ' . $limit_nb; return $sql; } /* getWhere() Récupération de la clause where Paramètres: void Retour: string
  • /
public function getQuery() { return $this->query_where; } } ?>

Conclusion :


Exemple de fonctionnement:
<?php
// création d'objet
$s = new dbSearch( $_POST['search_option'], $_POST['search_text'] );

/*
ici, recherche dans la table news
on récupère le champ id
la recherche se fait dans les champs titre et texte
classement selon id, desc
limit 0, 10
  • /

$sql = $s->mkQuery( 'news', 'id', array( 'titre', 'texte' ), 'id', 'desc', 0, 10 )
/*
$sql['select'] // requête de select
$sql['count'] // requête de comptage
  • /

?>

La fonction getQuery permet de récupérer la requête MySQL mais sans le LIMIT, utile si vous voulez faire un affichage page par page et que la recherche ne change pas.

Voilà, j'attends vos commentaires

A voir également

Ajouter un commentaire

Commentaires

mastermh73
Messages postés
1
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
19 mai 2010
-
bonjours a tous, peut-etre ma question va parraitre un peu stupide mais est ce qu'on peur utiliser ce moteur de recherche pour une galerie d'image.
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Salut!
$_POST['search_text'] contient l'entrée de l'utilisateur, tu peux l'afficher!

Bonne soirée!

Raf
thomasxsolutions
Messages postés
2
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
28 avril 2009
-
slt, tout d'abord bravo pour ce script coockiesch, il est génial. j'ai juste un petit problème, je n'arrive pas à afficher le texte recherché dans ma BDD: voici le code SQL d'affichage des résultats que j'ai mis dans une autre page php:

<?php
$host = "localhost";
$login = "root";
$pass = "";
$nom_db = "test";

mysql_connect("$host", "$login","$pass") or die ("pas connecté");
mysql_select_db("$nom_db") or die ("aucune BDD active");
$forbidden = array( 'le', 'la', 'des' );
$s = new dbSearch( $_POST['search_option'], $_POST['search_text'], $forbidden );
$sql = $s->mkQuery( 'test', 'id', array( 'DOCS', 'Contenu' ), 'id', 'desc',0,10 );
echo $sql['select'] . '

' . mysql_error();
$result = mysql_query(isset ($_POST [$sql['select']]) ) or die( 'Erreur MySQL' ); // si erreur

while( $row = mysql_fetch_assoc( $result ) )
{
// affichage normal ici (titre et texte récupérés), genre:
echo 'documents: ' , stripslashes( $row['DOCS'] ) , '
' , stripslashes( $row['Contenu'] ) , '
<hr />';
}
mysql_close();
?>

Je ne suis que débutant en PHP, pourez-tu m'aider? merci d'avance
tom
cs_lanner
Messages postés
131
Date d'inscription
samedi 16 avril 2005
Statut
Membre
Dernière intervention
8 avril 2015
-
Salut tout le monde
J'ai vraiment un soucis je n'arrive pas du tout à le faire fonctionner , jais pourtant bien fait la connexion à la base de donnée mais rien ne s'affiche , ni même aucunes erreurs...
Serait il possible de mettre en place un exemple simple (fichier sql basic + un fichier php prêt à l'emploi) avec la connexion bdd etc
Merci d'avance à vous
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
A la ligne 128:$sql array( 'select'> 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ' . $this->query_where, 'count' => 'SELECT count(*) FROM ' . $table . ' WHERE ' . $this->query_where );

--->
$sql array( 'select'> 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ' . $this->query_where, 'count' => 'SELECT count(*) FROM ' . $table . ' WHERE (' . $this->query_where . ') AND ( t1.id=t2.id ) );

Tu peux aussi faire comme ceci:$sql array( 'select'> 'SELECT ' . $select . ' FROM ' . $table . ' WHERE (' . $this->query_where . ( empty( $whereSup ) ? '' : ' AND ( ' . $whereSup . ')' ), 'count' => 'SELECT count(*) FROM ' . $table . ' WHERE (' . $this->query_where . ')' . ( empty( $whereSup ) ? '' : ' AND ( ' . $whereSup . ')' ) );

Et modifier:
public function mkQuery( $table, $select, $champs, $order, $sens, $limit_start, $limit_nb )
EN
public function mkQuery( $table, $select, $champs, $order, $sens, $limit_start, $limit_nb, $whereSup = '' )

Et tu peux donc passer un paramètre de plus à ta fonction, qui sera ajouté au requêtes... :)

Ca joue? :)

Raf

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.