<?php
/*
+------------------------------------------------------------------------ +
| Petit moteur de recherche |
+------------------------------------------------------------------------ +
| Inspirez-vous de ce script qui peut être encore optimisé. Ce script |
| est complété par une table mysql utilisée pour le filtrage de mots |
| inutiles (articles, adverbes, conjonctions de coordination...). |
| N'hésitez pas à me contacter pour tout renseignement ou me signaler |
| l'utilisation de ce code, cela me ferait plaisir! |
+------------------------------------------------------------------------ +
| Auteur: Jérôme |
| Email: jerome@yayel.com |
| Web: http://www.yayel.com/ |
+------------------------------------------------------------------------ +
| Prérequis: |
| - un formulaire html renvoyant au script la chaîne $query de mots à |
| rechercher |
| - une table mysql objet de la recherche |
| - une table mysql 'filtre' dont les INSERT sont dans un fichier |
| à télecharger sur http://www.phpinfo.net/download/filtre.zip |
+------------------------------------------------------------------------ +
*/
// connexion à la base:
$login = 'xxxx' ;
$db = 'xxxx' ;
$passwd = 'xxxx' ;
$host = 'xxxx' ;
mysql_pconnect($host,$login,$passwd) ;
mysql_select_db($db) ;
// on duplique la requete de recherche
$termes = $query ;
// passage en minuscules: la requete mysql qui va suivre
// sera sensible à la casse (pour les serveurs anciens),
// et notre filtre aussi.
$query = strtolower($query) ;
// si votre table d'informations ne contient pas d'accents,
// dé-commentez les 3 lignes suivante:
// $query = strtr( $query,
// "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
// "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" ) ;
// remplacement des caractères non alphanumeriques
// par des espaces doubles.
$query = ereg_replace('[^[:alpha:]]',' ',$query) ;
// ajout de doubles espaces au debut et a la fin
// (serviront au hashage plus loin)
$texte = ' '.$texte.' ' ;
// on charge le filtre et une boucle while
// va filtrer notre chaîne de mots à rechercher
$sql = mysql_query('SELECT mot FROM filtre') ;
while($filtre = mysql_fetch_array($sql) )
{
$query = eregi_replace( ' '.trim($filtre[mot]).' ', ' ', $query) ;
}
mysql_free_result($sql) ;
// on supprime les mots de moins de 3 lettres
$query = eregi_replace(' [a-z]{1,2} ', ' ', $query);
// suppression des premiers et derniers espaces
$query = trim($query) ;
// on fait un peu le menage de espaces superflus et on hashe
$query = ereg_replace(' +','|',$query) ;
// exemple de requete mysql: recherche sur un auteur ou un titre d'ouvrages
// par ordre décroissant de parution
$resultat = mysql_query('
SELECT titre, auteur
FROM ouvrages
WHERE LOWER(titre) REGEXP ('.$query.') OR LOWER(auteur) REGEXP ('.$query.')
ORDER BY date DESC') ;
// Attention: LOWER() est ici utilisé car la fonction REGEXP est sensible à la
// casse. et nous avions tout-à-l'heure mis notre query en minuscules
// TOUTEFOIS: LES DERNIERES VERSIONS DE MYSQL ONT ENFIN LA FONCTION REGEXP
// INSENSIBLE LES LOWER() PEUVENT ALORS ETRE RETIRES DE LA REQUETE
// (mais pas le strtolower() du debut de script)
// Inutile d'utiliser la fonction php sql_regcase();
// ( http://www.php.net/manual/fr/function.sql-regcase.php )
// la requête mysqlsql sera d'autant plus longue...
// Pourquoi utiliser REGEXP et non LIKE comment beaucoup le conseillent sur
// les forums ? Tout simplement parce que LIKE est 2 à 4 fois plus lent que
// REGEXP (faîtes le test avec un client mySQL donnant les temps à chaque
// commande).
// WHERE LOWER(titre) REGEXP ('freres|humains')
// n'est-t-il pas plus court que
// WHERE titre LIKE '%freres%' OR titre LIKE '%humains%'
// Imaginez simplement la longueur d'une requete avec 4 mots clés sur 4 champs !
// affichage des résultats: c'est là que vous intervenez pour mettre tout
// ceci en forme avec vos talents en html
echo "Votre recherche de $termes\n\n" ;
while ( $champ = mysql_fetch_array($resultat) )
{
echo 'Auteur: '.$champ[auteur].' - "'.$champ[titre]."\" \n" ;
}
mysql_free_result($resultat) ;
?>