Création d'un moteur de recherches

Attention, depuis PHP 5.5.0, certaines extensions SQL sans doute utilisées dans ce tutoriel peuvent être obsolètes et seront supprimées dans le futur, vous devez donc adapter les codes! Exemples ici.

Comment créer un moteur de recherches sur un site dynamique? C'est ce que nous allons voir dans cette partie .

On créé un nouveau fichier à partir du fichier gabarit.php que l'on va nommer moteur.php.

Un moteur de recherches, c'est au point de départ un simple formulaire.

<form method="post" action="moteur.php">
<p>
<input size="50" name="requete" value="" type="text"/>
<input value="Rechercher" name="submit" type="submit"/>
</p>
</form>

Ensuite, il faut traiter la requête de l'utilisateur :

<?php
if(isset($_POST['submit']))
{
//On nettoie un peut la requête
$requete = trim(stripcslashes(htmlspecialchars($_POST['requete'])));
 
}
?>

Une fois la requête "néttoyé", on  se connecte à la base de données et on effectue une recherche de la requête dans les champs titre, description et texte.

<?php
if(isset($_POST['submit']))
{
//On nettoie un peut la requête
$requete = trim(stripcslashes(htmlspecialchars($_POST['requete'])));
 
//On se connecte à la base de données
include('connexion_bd.php');
 
mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir correctement remplit les donn&eacute;es du fichier connexion_bd.php.');
 
$query = mysql_query("SELECT id,titre,description,texte FROM CONTENU WHERE titre 
REGEXP '[[:<:]]"
.mysql_real_escape_string($requete)."[[:>:]]' OR description
REGEXP '[[:<:]]"
.mysql_real_escape_string($requete)."[[:>:]]' OR texte
REGEXP '[[:<:]]"
.mysql_real_escape_string($requete)."[[:>:]]' ORDER BY id ASC") or die (mysql_error()); } ?>

Pour déterminer les limites d'un mot, on utilise ici la fonction REGEXP [[:<:]]$requete [[:>:]]. Généralement, on a tendance à utiliser la fonction LIKE '%$requete%' mais celle-ci nous ressort parfois beaucoup de résultats inutiles...

La suite du code est simple :

  • On vérifie si la requête ressort un résultat.
  • Si il y a au moins un résultat, on affiche le titre+lien et la description de la page concernée.
  • Si il n'y a aucun résultat, on affiche un texte.
<?php
if(isset($_POST['submit']))
{
//On nettoie un peut la requête
$requete = trim(stripcslashes(htmlspecialchars($_POST['requete'])));
 
//On se connecte à la base de données
include('connexion_bd.php');
 
mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir correctement remplit les donn&eacute;es du fichier connexion_bd.php.');
 
$query = mysql_query("SELECT id,titre,description,texte FROM CONTENU WHERE titre 
REGEXP '[[:<:]]"
.mysql_real_escape_string($requete)."[[:>:]]' OR description
REGEXP '[[:<:]]"
.mysql_real_escape_string($requete)."[[:>:]]' OR texte
REGEXP '[[:<:]]"
.mysql_real_escape_string($requete)."[[:>:]]' ORDER BY id ASC") or die (mysql_error());   //On utilise la fonction mysql_num_rows pour compter les résultats $nb_resultats = mysql_num_rows($query); //Si le nombre de résultats est différent de 0, on continue if($nb_resultats != 0) { //On affiche le nombre de résultats echo 'Il existe <b>'.$nb_resultats.'</b>'; if($nb_resultats > 1) // on vérifie le nombre de résultats pour orthographier correctement. { echo ' r&eacute;sultats'; } else { echo ' r&eacute;sultat'; } echo ' pour votre recherche "<b>'.$requete.'</b>" trouv&eacute; :<br/>'; //On attribue un chiffre pour chaque enregistrement trouvé $i = "1"; //On boucle pour afficher la liste des enregistrements trouvés while($donnees = mysql_fetch_array($query)) { echo '<div class="cadre"><big><big>'.$i.'-<a title="'.$donnees['titre'].'" href="page.php?id='.$donnees['id'].'">'.$donnees['titre'].'</a></big></big><br/><p>'.$donnees['description'].'</p></div>'; $i++; } //on ferme if($nb_resultats > 1) } //Si il n'y a rien else { echo '<p>Nous n\'avons trouv&eacute; aucun r&eacute;sultats pour votre recherche "<b>
'
.$requete.'</b>" !</p>'; } //On ferme if(isset($_POST['requete']) } //On ferme mysql mysql_close(); ?>

Ceci étant fait, (je vous laisse la mise en page ^^) il nous reste plus qu'à afficher le formulaire sur toutes les pages. Personnellement, je l'ai ajouté en fin de menu du fichier menu.php.

<h1>Recherches</h1>
<form method="post" action="moteur.php">
<p><input size="20" name="requete" value="" type="text"/>
<input value="Rechercher" name="submit" type="submit"/></p>
</form>
</div>
Voir/déposer un commentaire (9) | Signaler un problème