Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Systèmes complets > Lecture du tutoriel

Réaliser un moteur de recherche pour son site

Avatar
Auteur : virjule
Créé : le 24/03/2006 16:23:24
Modifié : le 06/10/2007 11:39:38
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Bien le bonjour ! Dans ce court tutorial, nous verrons comment créer un petit moteur de recherche pour son site internet avec des tables MySQL et un critère spécial ainsi qu'une autre fonction qui pourrait vous être utile.

Vous verrez, créer un moteur de recherche pour son site n'est guère difficile, et utiliser une requête spéciale de MySQL suffira. Nous verrons également comment vérifier le nombre de requêtes avec une fonction PHP, lisez donc la suite !

Avant que je ne reçoive d'autres critiques de codeurs élitistes ( :-° ) et que vous vous lanciez dans ce tutorial, comme le précise bien le titre notre but est de créer quelque chose de SIMPLE. Si vous souhaitez faire quelque chose de plus poussé, tournez vous vers le critère FULLTEXT, qui lui n'est pas abordé dans ce tutorial. Merci de votre compréhension ...
Sommaire du chapitre :

Où faire la recherche ?

Où faire la recherche ?


C'est la première question que vous devez vous poser. Où réaliser la recherche ? Dans quelles tables ?

C'est très simple. Il suffit de faire la recherche dans la table où se trouvent les articles susceptibles d'être recherchés. Vous pouvez utiliser plusieurs tables, bien sûr.

Dans mon cas, je vais créer un mini-moteur de recherche pour un site comme le Site du Zér0, qui propose des tutos mais aussi des tables contenant des informations sur les fonctions en PHP, ici nommée fonctions :p . C'est ici que je vais lancer la recherche.

Voici les champs de ma table :
  • id
  • nom_fonction
  • texte

C'est tout !
Le premier champ, vous comprendrez sûrement à quoi il sert : c'est un champ qui permet d'identifier chaque entrée de la table avec un numéro qui s'incrémente automatiquement (voir le cours de M@teo21 pour les trous de mémoire), pour pouvoir les sélectionner et les classer sans difficulté ;) . Le deuxième, c'est le nom de la fonction (par exemple, mysql_query). Et le troisième, c'est le texte qui présente la fonction, qui décrit son fonctionnement...

Ce n'est qu'un exemple. Vous pouvez très bien faire un moteur de recherche pour des fiches de jeux vidéos ou tout autre sorte d'article.

La page qui affichera le contenu de la fonction se nommera fonction.php et contiendra dans l'url l'id de l'entrée concernée enregistrée sous MySQL (qui correspond donc à la fonction actuellement affichée). Si il n'y a pas d'id, un message d'erreur apparaîtra. Mais ce n'est pas ça que nous réaliserons au cours de ce tuto, mais le moteur qui permettra de faire des recherches dans cette table... Vous imaginez, si le site répertorie toutes les fonctions PHP qui existent et encore d'autres venant de diverses bibliothèques :o ? L'intéressé sera vite décourager à la vue du nombre de fonction.
Heureusement, on peut lui simplifier la vie avec le système de recherche.

Je vais maintenant vous présenter la requête SQL qui permet d'effectuer une recherche ;) .

Le critère de sélection LIKE

Nous allons voir maintenant ce qu'est le critère LIKE et comment l'utiliser dans notre cas, mais aussi comment il fonctionne.

Tout d'abord, il faut savoir que le critère LIKE est un "argument" SQL, un peut comme les WHERE et autres ORDER BY. LIKE signifie "comme" (anglais inside :p ). On l'utilise toujours au côté d'un WHERE. En gros, si on tape "WHERE nom_fonction LIKE 'mysql'", cela signifie "dont le nom de la fonction est comme "mysql". Il est utilisé pour les barres de recherche que beaucoup de sites possèdent, c'est pourquoi je vous le présente ;) .

Pour utiliser ce critère (dans notre situation), il faut l'utiliser dans une requête de sélection. Voici ce que cela donnera au final :

Code : SQL
1
SELECT * FROM fonctions WHERE nom_fonction LIKE '%mysql%' ORDER BY nom_fonction


Tout d'abord, on sélectionne la table, puis on met un WHERE pour dire à quel champ doit correspondre la recherche et enfin le fameux LIKE, suivi de '%mysql%' qui détermine le mot clé recherché. Je vais d'ailleurs détailler ce dernier. Les sigles % signifient qu'il peut y avoir n'importe quoi avant et après le mot clé "mysql". Par exemple, on peut très bien obtenir des résultats de ce style pour une recherche "mysql" :
  1. mysql_query
  2. mysql_fetch_array
  3. select_mysql_db (j'invente, ce n'est que pour vous montrer que quelque chose peut se trouver devant la requête donnée)

En gros, les % sont un peu comme les X en mathématiques, cela peut prendre n'importe quelle valeur. On peut en placer devant ou derrière la requête, pour dire si il peut y avoir des valeurs devant et/ou derrière. Par contre, si vous ne mettez qu'un seul % (devant ou derrière), il n'y aura de valeurs supplémentaires possibles que de ce côté là.

Enfin, le "mysql" entre '%%' , c'est notre mot clé. La requête SQL sélectionnera donc toutes les entrées de la table fonction dont le champ nom_fonction contient le mot clé mysql et classera les résultat par odre alphabétique grâce au critère ORDER BY.

Ce critère est donc très, très simple à utiliser.

Attention ! Si vous ne mettez pas les sigles %, la requête SQL sélectionnera les champs qui contiennent juste "mysql", sans rien devant ni derrière, à la manière d'un WHERE classique ! Faites donc attention !


Voilà, passons à la suite, la réalisation du script :) .

Réalisation du script

Voilà, nous arrivons déjà à la dernière partie de ce tuto. Nous allons réaliser le script pour faire les recherches ! Tout d'abord, voici le schéma du script :


C'est tout simple ! Néammoins, il faut que je précise un petit point avant que vous ne vous lanciez dans votre script. En effet, pour vérifier le nombre de résultat, il faut utiliser une fonction spéciale, mysql_num_rows, qui va compter le nombre de résultat. Voilà ce que ça donnera :

Code : PHP
1
2
3
4
5
6
// ...
$query = mysql_query("SELECT * FROM fonctions WHERE fonction LIKE '%$recherche%' ORDER BY fonction") or die (mysql_error()); // On exécute la requête. Je précise qu'ici, la variable "$recherche" contient la recherche obtenue lors du post. Nous verrons ça un peu plus bas en détails.
$verif = mysql_num_rows($query); // On créé la variable "$verif" qui servira à vérifier si on a des résultats ou non
if($verif != 0) // On fait tout simplement une condition pour savoir "si le résultat est différent de 0...". Si c'est le cas, il y a bien des résultats.
{
//...


Cette fonction est très simple à utiliser. Vous pourrez notemment l'utiliser plus bas pour vérifier si le résultat est égal ou supérieur à 1, pour déterminer si il faut employer le pluriel ou le singulier lorsque le script emploie une phrase telle que "vous avez 10 résultats", pusiqu'il peut aussi bien y avoir 1 ou 10 résultats :-° ...

Voilà, maintenant j'estime que je peux vous laisser faire tout ça tout seul, comme dans un TP ! Mais je vais quand même vous afficher un script qui sert de moteur de recherche !

Pour cet exemple, j'utilise la table imaginaire que j'ai inventée en début de ce tutorial, la table fonctions.


Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?
if(isset($_POST['requete']) && $_POST['requete'] != NULL) // on vérifie d'abord l'existence du post et on vérifie aussi si la requete n'est pas vide.
{
mysql_connect('localhost','root','');
mysql_select_db('bdd'); // on se connecte à MySQL. Je vous laisse remplacer les différentes informations pour adapter à votre site.
$requete = htmlspecialchars($_POST['requete']); // on créé une variable $requete pour faciliter l'écriture de la requete sql, mais aussi pour empêcher les éventuels malins qui utiliseraient du Php ou du JS, avec la fonction htmlspecialchars().
$query = mysql_query("SELECT * FROM fonctions WHERE nom_fonction LIKE '%$requete%' ORDER BY id DESC") or die (mysql_error()); // la requête, que maintenant vous devez comprendre ;)
$nb_resultats = mysql_num_rows($query); // on utilise la fonction mysql_num_rows pour compter les résultats pour vérifier par après
if($nb_resultats != 0) // si le nombre de résultats est supérieur à 0, on continue
{
// maintenant, on va afficher les résultats et la page qui donne les résultats et le nombre de résultats, avec un peu de code HTML pour faciliter la tâche.
?>
<h3>Résultats de votre recherche.</h3>
<p>Nous avons trouvé <? echo $nb_resultats; // on affiche le nombre de résultats 
if($nb_resultats > 1) { echo 'résultats'; } else { echo 'résultat'; } // on vérifie le nombre de résultats pour orthographier correctement. 
?>
dans notre base de données. Voici les fonctions que nous avons trouvé :<br/>
<br/>
<?
while($donnees = mysql_fetch_array($query)) // on fait un while pour afficher la liste des fonctions trouvées, ainsi que l'id qui permettra de faire le lien vers la page de la fonction
{
?>
<a href="fonction.php?id=<? echo $donnees['id']; ?>"><? echo $donnees['nom_fonction']; ?></a><br/>
<?
} // fin de la boucle
?><br/>
<br/>
<a href="rechercher.php">Faire une nouvelle recherche</a></p>
<?
} // fini d'afficher les résultats ! Maintenant, nous allons afficher l'éventuelle erreur en cas d'échec de recherche et le formulaire.
else
{ // de nouveau, un peu de HTML
?>
<h3>Pas de résultats</h3>
<p>Nous n'avons trouvé aucun résultats pour votre requête "<? echo $_POST['requete']; ?>". <a href="rechercher.php">Réessayez</a> avec autre chose.</p>
<?
}// fini d'afficher l'erreur ^^
mysql_close(); // on ferme mysql, on n'en a plus besoin
}
else
{ // et voilà le formulaire, en HTML de nouveau !
?>
<p>Vous allez faire une recherche dans notre base de données concernant les fonctions PHP. Tapez une requête pour réaliser une recherche.</p>
 <form action="rechercher.php" method="Post">
<input type="text" name="requete" size="10">
<input type="submit" value="Ok">
</form>
<?
}
// et voilà, c'est fini !
?>


Il reste un dernier petit point à aborder : les différentes façons d'utiliser LIKE.

D'autres manières d'exploiter LIKE

Dans le script que je vous ai donné, en exemple, nous utilisions LIKE de cette façon :

Code : SQL
1
... LIKE '%$requete%' ...


De façon à faire une recherche dans une table avec un mot-clé. Mais nous avons aussi vu qu'on pouvait exploiter LIKE de deux autres façons :


Et bien il y a moyen d'utiliser ces deux façons. Vous savez maintenant que le % représente une valeur quelconque (un peu comme un X en mathématique). Si on place le % après la variable, on trouvera des résultats avec le mot-clé puis éventuellement des caractères supplémentaires à côté. Dans le script réalisé précédemment, nous avions mis les % de part et d'autre de la variable pour obtenir tout un tas de résultat.

Et bien sachez que vous pouvez utilisez les deux autres manières citées plus haut. Comment ? Je vous donne des exemples ! ;)

LIKE '$requete%'



En sachant que la variable $requete représente une lettre de l'alphabet ... Oui oui, c'est bien ça : avec cette façon d'exploiter LIKE vous pourrez faire des recherches en fonction des lettres de l'alphabet ;) Vous n'avez qu'à faire une liste avec les lettres, et après envoi de la requête MySQL ira chercher des entrées où le mot commence par la lettre choisie. Ce n'est pas plus compliqué que ça ! ;) Pensez tout de même à mettre, si vous réalisez ce type de script et que votre "dictionnaire" ou autres contient des mots commencant par des chiffres, de mettre une dernière option qui ira chercher tous les résultats commencant par un chiffre. Je pense que vous êtes assez grands pour vous débrouiller pour ça ! ^^

LIKE '%$requete'



A vrai dire j'ai mis un peu de temps pour trouver une manière de l'utiliser ... ^^ Disons que vous réaliser une sorte de beschrelle online (le net en a bien besoin n'empêche :-° ). Un de vos visiteurs veut voir toute la liste des verbes qui se terminent par ER. Et bien on fera cette requête toute simple :

Code : SQL
1
SELECT * FROM liste_verbes WHERE verbe LIKE '%er' ORDER BY verbe


Et le visiteur aura sa liste des verbes en ER.

Citation : Moteur de recherche (beschrelle)
Aimer
Chanter
Danser
Manger
...


Voilà, nous avons fait le tour des possibilités du critère de sélection LIKE. J'espère que en ferez bon usage ! ^^

J'ai mis en ligne un petit QCM qui permettra de vous tester : savez-vous ou non utiliser le critère LIKE, avec différentes manières ? Mais je suis sûr que vous réussirez les doigts dans le nez ! :D

Q.C.M.

Quel critère est utilisé pour faire des petits moteurs de recherches ?
Comment faire pour qu'un LIKE ne fasse pas le même effet qu'un WHERE classique ?
Si je ne mets qu'un seul des signes devant ou derrière la variable, que ce passera-t-il ?
Quelle peut être l'utilité de cette requête : "LIKE '$requete%'" ?
Quelle fonction PHP permet de compter les résultats d'une requête ?


Et bien voilà, ce n'était pas bien compliqué.

En lisant ce tuto, vous avez appris à utiliser le critère de sélection LIKE, comment vérifier le nombre de résultats ainsi que les différentes manière d'utiliser LIKE. J'espère que vous aurez pris autant de plaisir à lire ce tutorial autant que j'en ai eu à l'écrire et que vous aurez appris des choses utiles et qui vous serviront pour votre site ;) !
Auteur : virjule
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 498 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1338s (0.115s)