Moteur de recherche
Sur cette page, vous allez apprendre à créer un petit moteur de recherche qui va aller regarder dans la BDD si les mots tapés s'y trouvent ou non.

La table
La table du moteur de recherche est des plus simple. Voici la liste des champs qu'elle contient:
-id, int 10, auto_index, clé d'index
-titre, varchar 50
-lien, varchar 75
-description, text
-keywords, text

Nous allons maintenant pouvoir attaquer le moteur de recherche. La première chose à faire est d'écrire le head de la page:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Moteur de recherche de theprogrammeur</title>
</head>
<body>

Notre petit moteur de recherche n'est composé que d'un formulaire qui sera affiché en permanence (comme dans Google).

<form method="post" action="recherche.php">
Votre recherche:
<input type="text" name="recherche" value="<?php $_POST['recherche']; ?>" /><br />
<input type="submit" value="Rechercher" name="rechercher" />
</form>

Rien de bien nouveau dans ce formulaire. Vous aurez sans doute remarqué que j'y ai rajouté un brin de PHP pour mieux imiter les moteurs de recherches tels que Google, Yahoo,...
On écrit la recherche effectuée par l'utilisatuer afin qu'il se souvienne des termes exacts de sa recherche. S'il n'a encore rien recherché, la variable $_POST['recherche'] n'existera pas et donc rien ne sera écrit, ce qui est encore juste.

La recherche

Maintenant que le visiteur à saisi les termes de sa recherche, il faut encore les rechercher dans la BDD. Première chose, se connecter à la BDD si on a posté une recherche et commencer à compter le temps de la recherche (voir script dans ce site).

if(isset($_POST['recherche']) && !empty($_POST['recherche'])){
$connection = mysql_connect('localhost', 'root', '') or die('Informations de connection incorrectes!');
mysql_select_db('recherche') or die('Erreur lors de la connection à la BDD');

//Calcul du temps
$execution = microtime();
$execution = explode(' ',$execution);
$execution_debut = $execution[1]+$execution[0]
//Fin de calcul

J'aurais pu écrire la condition de manière plus simple (seulement !empty) mais j'ai tenté de faire plus clair en ajoutant isset.
Nous allons maintenant séparer les termes de la rechreche.

:pourquoi faut-il séparer les termes, on ne peut pas se contenter de faire "SELECT * FROM recherche WHERE description='$recherche'" ?

Non, sinon il aurait fallu que les termes de la recherches soient tous mis dans la BDD et dans le même ordre, ce qui est pratiquement impossible.
Pour séparer ces termes, nous allons utilser un fonction que vous connaissez déjà...explode().
C'est parti:

$recherche = htmlspecialchars(htmlentities($_POST['recherche']));
//Sécurisation des termes de la recherche

$mots = explode(" ", $recherche);
//On sépare les mots à chaque espace trouvé

$nb_mots = count ($mots);
//Comptage du nombre de mots

Nous avons utilsé la fonction count() pour compter combien de mots contient l'array $mots. Il faut maintenant faire un boucle pour recherche chaque mot un par un dans la BDD et c'est là qu'on à un problème!

:quel problème, ça me semble simple, on selectionne les entrées qui correspondent au mot tapé!

Ce système ne fonctionnera pas pour la bonne raison que, si nous avons cet enregistrement dans la BDD:"J'aime le chocolat en barres" et que l'utilisateur tape ce mot clé:"chocolat", il ne pourra jamais trouver la phrase car l'enregistrement ne correspond pas au mot-clé tapé.

Nous allons donc utiliser le critère LIKE dans la requête MySQL qui regardera si le mot tapé se trouve dans l'enregistrement.

Un autre problème se présente alors à nous. Et si l'utilisateur avait tapé "chocola", il n'aurait jamais pu trouver le résultat car il a fait une faute dans son mot. Nous allons donc devoir ajouter le symbole "%" avant et après le mot tapé pour dire qu'il peut y avoir des lettres avant et après celles tapés dans la recherche.
Passons au code PHP:

$requete_bdd = null;
$words_while = null;
//Initialisation des variables utilisées dans la boucle

while($words_boucle < $nb_mots){
$requete_bdd .= "OR titre LIKE '%$mots[$words_boucle]%'
OR description LIKE '%$mots[$words_boucle]%'
OR keywords LIKE '%$mots[$words_boucle]%'"
;
$words_boucle++;
}

Cette boucle n'est pas simple à comprendre. En fait, on regarde si le mot clé 1 se trouve dans le champ titre OU dans le champ description OU dans le cham keyword OU mot-clé 2 se trouve ....
Le dernier problème est qu'il y a un "OR" de trop au début de la boucle. Il faut le supprimer. Pour ce faire, nous allons utiliser substr() qui retourne une partie de chaine.

$requete_bdd = substr($requete_bdd, 2);

On retire les deux premiers caractères de la chaine.
Nous pouvons donc (enfin) faire notre recherche dans la BDD, compter le nombre de résultats et les afficher. Le reste est très facile.

$sql = "SELECT * FROM recherche WHERE $valeur_requete ORDER BY id DESC";
$resultats_recherche = mysql_query($sql) or die('La recherche à échoué');
//Requête

$nb_resultats = mysql_num_rows($resultats_recherche);
//Comptage des résultats

La requête fatidique a été faite, on affiche le temps qu'elle a pris ainsi que les résultats:

//Début calcul temps
$execution = microtime();
$execution = explode(' ',$execution);
$execution_fin = $execution[1]+$execution[0];
$temps = $execution_fin-$execution_debut;
echo'Recherche effectuée en '.$temps.' secondes.';
//Fin temps

if($nb_resutats == 0){
echo'Aucun résultat n\a été trouvé dans notre base de données essayez avec des termes plus globaux
et vérifiez votre orthographe.'
;
}
//Petite condition pour afficher le nombre de résultats

else{
echo'Il y a '.$nb_resultats.' résultats.';

//Boucle pour afficher les résultats
while($erire_results = mysql_fetch_array($resultats_recherche) ) //boucle affichant les resultats
{
echo'<a href="'.$ecrire_results['lien'].'"><'.$ecrire_results['titre'].'</a><br />';
echo $ecrire_results['description'].'<br /><br />';
}
}//Fin du else
}//Fin du if

mysql_close($connection);
//N'oublions pas de nous déconnecter

Votre moteur de recherche est maintenant terminé. Il ne vous reste plus qu'à remplir la table avec toutes les pages de votre site.

Creative Commons License
Sauf mention contraire, le contenu de cette page est sous licence Creative Commons
Page générée en 0.3987 secondes.
Retour en haut de la page
Imprimer cette page