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
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.