equal for all

mercredi 14 juillet 2010

moteur de recherche simple en PHP

Comment construire un moteur de recherche en php ? Le principe de base est très simple. Là où ça se se corse, c'est pour faire quelque chose de convivial, notamment avec un affichage page par page ou avec des requetes complexes. Voyons cela dans l'ordre.

Un moteur de recherche tout simple

Reprenons notre table "tutoriel" avec ses 4 champs, id, nom, prénom, mail.
Bien que cela ne présente pas grand intérêt, imaginons que nous voulions proposer aux visiteurs de voir tous les inscrits portant le prénom de Pierre. le problème à résoudre est très simple et vous savez en fait déjà le faire ! Il faut créer un formulaire avec un champ texte dans lequel les visiteurs taperont le prénom recherché, récupérer cette info, l'utiliser pour faire un select sur la table et afficher les données sélectionnées dans un joli tableau.
Si on appelle f_prenom la boite de texte du formulaire, la partie interrogation de la table donnera quelque chose du genre :
$requete= "select * from tutoriel where prenom like '%$f_prenom%'";
$resultat=mysql_query($requete);
while ($rows=mysql_fetch_array($resultat)) {
$nom=$rows[nom]; $prenom=$rows[prenom] ; $adresse=$rows[mail];
echo "nom : $nom, prenom : $prenom, adresse : $adresse";
La seule nouveauté ici est le like'%$f_prenom%'. Les % sont des jokers permettant de rechercher tous les prénoms contenant la valeur de $f_joker. Donc aussi bien Paul que Jean-Paul ou Paul-Henri.
Bien sur il convient d'ajouter les traitements éventuels pour éviter les caractères à problèmes (addslashes permet d'ajouter un antislash pour les 'échapper' quand on passe du web à la base et stripslashes permet de faire l'inverse), traiter, le problème des majuscules/minuscules (voir page pasapas), et faire une mise en forme sympa. Mais il n'y a rien de bien nouveau.




Une requete plus complexe ; transformation de texte en tableau



Comment faire maintenant pour trouver tous les Pierre ou Paul ou Simon dans notre table ?
On peut proposer aux lecteurs de saisir les différents noms séparés par un simple espace. La boite de texte renvoie une variable $f_prenom qui sera alors Pierre Paul Simon. Il faut que l'on transforme ce texte pour construire la requete qui donnera :
$requete : "select * from tutoriel where prenom like '%Paul% OR prenom like '%Simon% OR prenom like '%Pierre%'"
Nous allons donc traiter $f_prenom.
Nous allons tout d'abord transformer le texte en tableau en utilisant l'espace comme séparateur
  $prenoms = split(" ",$f_prenom);
on compte ensuite le nombre d'éléments dans le tableau $prenoms ainsi créé
  $nbprenoms = count($prenoms);
on commence à écrire la requete avec le premier élément du tableau (son indice est 0)
  $critere=" prenom like '%$prenoms[0]%'";
on boucle ensuite jusqu'au dernier élément du tableau
 $z=1;
while($z<$nbprenoms){    $critere.=" OR prenom like '%$prenoms[$z]%'";   $z++;}
Si l'on voulait uniquement les fiches contenant les 3 prénoms (rare !) on remplacerait le OU par AND dans la construction du critère. On pourrait d'ailleurs donner le choix aux lecteurs dans le formulaire et renvoyer leur choix dans une variable $ETOU.
De façon similaire, on peut interroger notre table en utilisant plusieurs critères. Par exemple rechercher à la fois un nom et un prénom. Il faut juste ajouter à notre procédure quelques tests pour vérifier quels champs sont remplis sur le formulaire. Chaque champ peut éventuellement nécessiter un traitement comme celui que nous venons de voir. La requête peut ainsi ressembler à cela :
$critere1 = "prenom like '%toto'% and prenom like '%titi%'";
$critere2 = "or nom like '%bibi%'";
$requete = "select *from tutoriel where $critere1 and $critere2";
Attention à gérer correctement les mots de liaison (AND, OR). En mettant au point votre script, je vous conseille d'afficher les requetes (echo $requete) dans l'explorateur pour les vérifier.

Présentation des résultats

Vous pouvez classer les résultats. Par exemple pour les trier par ordre alphabétique du nom, ajoutez à la fin de la requête : order by nom. par défaut, le tri sera croissant. Si vous voulez qu'il soit décroissant, ajoutez desc. Vous pouvez trier aussi par date croissante ou décroissante si dans votre table vous avez un champ date.
Voici un exemple de requete relativement complexe déjà :
$critere="nom like '%titi%' AND prenom like'%toto%' OR prenom like '%tata%'";
$requete="select * from tutoriel WHERE $critere order by nom desc";
$resultat=mysql_query($requete);
Dans la page PHP : moteur avancé , vous verrez comment gérer l'affichage page par page des résultats.

5 commentaires:

Creation site web a dit…

Merci pour votre script, il a été très facile à mettre en place et il est très fonctionnel.

Anonyme a dit…

bonjour,
je suis entré de créer une site sur la gestion de bibliothèque en php, je veux créer un formulaire de recherche permutant au utilisateurs de chercher un abonné à partir de son identifiant

Anonyme a dit…

plus de précision s'il vous plaît

Anonyme a dit…

wtf?

Popitta a dit…

slv vous pouvez m'aider à trouver une application web GED open source php
merci d'avance

Enregistrer un commentaire