Moteur de recherche sur base mysql fulltext et boolean avec pagination des resultats

Soyez le premier à donner votre avis sur cette source.

Vue 14 690 fois - Téléchargée 2 882 fois

Description

BONJOUR

Un moteur de recherche basique qui pourra s'intégrer dans un site d'annonces ou un blog.
Le but du script est pédagogique pour présenter aux débutants un modèle j'ai pas vraiment chercher à compliquer donc on pourra utiliser PDO ...
je met dans la source une table bidon pour essayer,
taper Leblanc ou street ou street avenue en mode normal
en mode boolean on peut faire des comparaisons, lire les articles ...
ma requête est faite sur les champs 'adresse' et 'prenom'
en lisant les requêtes vous comprendrez comment changer
//ARTICLES et BASES
//http://francois.kubler.org/tuto/2-mysql-utiliser-les-index-fulltext/
//http://www.elliptic.fr/doc/mysql/string-comparison-functions.html
//http://www.od2dev.be/lang/en/mysql-fulltext-search/

A++

Source / Exemple :


<?php
/*coloration resultat*/
function replaceColor($str,$searchtxt){
$str = str_replace('\"', '"', 
substr(@preg_replace('#(\>(((([^><]+|(?R)))*)\<))#se', 
"@preg_replace('#\b(" . str_replace('\\', '\\\\', 
addslashes($searchtxt)) . ")\b#i',
'<span style=\"color:#FF0000\"><strong>\\\\1</strong></span>', '\\0')", '>' . $str . '<'), 1, -1));   
return $str;
}
?>
<?php 
//ARTICLES et BASES
//http://francois.kubler.org/tuto/2-mysql-utiliser-les-index-fulltext/
//http://www.elliptic.fr/doc/mysql/string-comparison-functions.html
//http://www.od2dev.be/lang/en/mysql-fulltext-search/

function searchForm(){ 
//form 
  echo '<div id="maincol" style="background-color: #fedcba;"><h1>MOTEUR SUR BASE MYSQL</h1>';
  $searchwords = (isset($_POST['words']) ? htmlspecialchars(stripslashes($_POST['words'])) : ''); 
  $normal = (isset($_POST['mode']) && $_POST['mode'] == 'normal') ? ' selected="selected"' : '' ; 
  $boolean = (isset($_POST['mode']) && $_POST['mode'] == 'boolean') ? ' selected="selected"' : '' ; 
  echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">'; 
  echo '<input type="hidden" name="cmd" value="search" />'; 
  echo 'Rechercher : <input type="text" name="words" value="'.$searchwords.'" /> '; 
  echo 'Mode: '; 
  echo '<select name="mode">'; 
  echo '<option value="normal"'.$normal.'>Normal</option>'; 
  echo '<option value="boolean"'.$boolean.'>Boolean</option>'; 
  echo '</select> '; 
  echo '<input type="submit" name="sub" value="GO" />'; 
  echo '</form>';
  echo '</div>'; 
} 

searchForm(); 

if(isset($_POST['sub'])){
$mode = $_POST['mode'];
$searchstring = $_POST['words'];
$limit='';
}

elseif(isset($_GET['mode']) &&  isset($_GET['words'])){
$mode = $_GET['mode'];
$searchstring = urldecode($_GET['words']);
}

else{
$searchstring=null;
$mode=null;
}
 
$num_per_page=3;

if(isset($_GET['p'])){
$start=(int)$_GET['p'];
$x=($start*$num_per_page);
$y=$num_per_page;
$limit='limit '.$x.','.$y;
}else{
$x=0;
$limit='';
}

//à personnaliser 
$host='localhost';
$user='root';
$pass='';
$base='a';
$table='mytable'; 
mysql_connect($host,$user,$pass);
mysql_select_db($base);
//

switch($mode){ 
   
case "normal":
echo '<h3>Mode normal :</h3>'; 

$searchstring=mysql_real_escape_string($searchstring);

$totalsql = "SELECT *, MATCH (prenom,adresse)
AGAINST ('".$searchstring."') as Score
FROM ".$table."
WHERE MATCH (prenom,adresse)
AGAINST ('".$searchstring."')
ORDER BY Score DESC";

$sql = "SELECT *, MATCH (prenom,adresse)
AGAINST ('".$searchstring."') as Score
FROM ".$table."
WHERE MATCH (prenom,adresse)
AGAINST ('".$searchstring."')
ORDER BY Score DESC $limit";

break;

case "boolean":
echo '<h3>Mode boolean :</h3>'; 
$totalsql = "SELECT *, MATCH (prenom,adresse)
AGAINST ('".$searchstring."' IN BOOLEAN MODE) as Score
FROM ".$table."
WHERE MATCH (prenom,adresse)
AGAINST ('+".$searchstring."' IN BOOLEAN MODE)
ORDER BY Score DESC";
                     

$sql = "SELECT *, MATCH (prenom,adresse)
AGAINST ('+".$searchstring."' IN BOOLEAN MODE) as Score
FROM ".$table."
WHERE MATCH (prenom,adresse)
AGAINST ('".$searchstring."' IN BOOLEAN MODE)
ORDER BY Score DESC $limit";
break;
  
}  

if(isset($sql) && !empty($sql)){
$result = mysql_query($sql) or die (mysql_error());
$total =  mysql_query($totalsql) or die (mysql_error());
echo $num=mysql_num_rows($total);
echo ' resultat(s) <br />';
$r=array();
while($row = mysql_fetch_object($result)){
$r[]=$row;
}

mysql_close();

//on borne ou pas
$borne=200;
if($num<$borne){
$num_pages=ceil($num/$num_per_page);
}else{
$num_pages=ceil($borne/$num_per_page);
}

$pageur=Array();

for ($i=0;$i<$num_pages;$i++){
if ($mode == 'normal') {
$pageur[]='<a href="?cmd=search&words='.urlencode($searchstring).'&mode=normal&p='.$i.'" > ['.($i+1).'] </a>';
}else{
$pageur[]='<a href="?cmd=search&words='.urlencode($searchstring).'&mode=boolean&p='.$i.'" > ['.($i+1).'] </a>';
}
}

}else{
}

//les resultats PAGINATION
if(!empty($pageur)){
echo implode($pageur);
}else{
//rien
}

//les resultats de la REQUETE
if(isset($r) && !empty($r)){
  
  echo '<pre>';
  //print_r($r);  //tout
  echo '</pre>'; 
                     
  //nb records found sur la page
  //echo $c=count($r);
  
  echo '<div style="background-color: #ddddff;">';
  echo '<pre>';
  
  
  //3 par page
  
  $b=3;
  
  for($i=0;$i<$b;$i++){
    
    if(isset($r[$i])){
    
    echo replaceColor($r[$i]->adresse,$searchstring).'<br />';
    echo replaceColor($r[$i]->prenom,$searchstring).'<br />';

    print_r($r[$i]); /*on formate comme on veut ...*/
    
    }else{
    }
  
  }
  
  echo '</pre>';
  echo '</div>';
  
}else{
//rien
}
?>

Conclusion :


Ce script et largement améliorable soyez indulgent

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Bonjour, et merci pour cette source très compréhensible !
La coloration syntaxique ne fonctionne pas en cas de saut de mots :
recherche => voiture moto

Résultat 1=> voiture moto (les deux mots sont coloré)
Résultat 2=> voiture camion moto (seul voiture est coloré, moto est resté noir)

Comment résoudre ce problème ?
Merci encore.
La pagination ne passe pas lorsque je clique sur la deuxième page.
Bonjour,
Je vous propose deux petits tuto pour implémenter une recherche FULLTEXT avec InnoDB en mode NATURAL ou BOOLEAN :
http://blog.axe-net.fr/recherche-pertinence-mysql-fulltext/
http://blog.axe-net.fr/tuto-mysql-fulltext-in-boolean-mode/

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.