<?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) ;

?>