0,
'restr' => '',
'order' => '',
'display',
'nbr_rows' => 0);
// $query_result['type'] = type de la requête :
// 0 : rien (problème)
// 1: match/against
// 2: regexp
// 3: regexp pure sans traitement
// $query_result['restr'] = critères de restriction
// $query_result['order'] = critères de tri
// $query_result['nbr_rows'] = nombre de lignes qui matchent
// $query_result['display'] = affichage en clair de la requête utilisateur
// si operator TRUE La recherche est booléenne AND
// si operator FALSE La recherche est booléenne OR
// si force_regexp : la recherche est forcée en mode regexp
$stopwords = FALSE;
global $dbh;
// initialisation opérateur
$operator ? $dopt = 'AND' : $dopt = 'OR';
$query = pmb_strtolower($query);
// espaces en début et fin
$query = pmb_preg_replace('/^\s+|\s+$/', '', $query);
// espaces en double
$query = pmb_preg_replace('/\s+/', ' ', $query);
// contrôle de la requete
if(!$query) return $query_result;
// déterminer si la requête est une regexp
// si c'est le cas, on utilise la saisie utilisateur sans modification
// (on part du principe qu'il sait ce qu'il fait)
if(pmb_preg_match('/\^|\$|\[|\]|\.|\*|\{|\}|\|/', $query)) {
// regexp pure : pas de modif de la saisie utilisateur
$query_result['type'] = 3;
if ($n_res) $query_result['restr'] = "n_resume REGEXP '$query' OR n_contenu REGEXP '$query' ";
else $query_result['restr'] = "";
if ($n_gen) {
if ($query_result['restr']) $query_result['restr'].=" OR ";
$query_result['restr'].= " n_gen REGEXP '$query'";
}
if ($n_tit) {
if ($query_result['restr']) $query_result['restr'].=" OR ";
$query_result['restr'].= " tit1 REGEXP '$query' OR tit2 REGEXP '$query' OR tit3 REGEXP '$query' OR tit4 REGEXP '$query' OR index_serie REGEXP '$query' ";
}
if ($n_mat) {
if ($query_result['restr']) $query_result['restr'].=" OR ";
$query_result['restr'].= " index_l REGEXP '$query' ";
}
$query_result['order'] = "index_serie ASC, tnvol ASC, index_sew ASC";
$query_result['display'] = $query;
} else {
// nettoyage de la chaîne
$query = pmb_preg_replace("/[\(\)\,\;\'\!\-\+]/", ' ', $query);
// on supprime les mots vides
$query = strip_empty_words($query);
// contrôle de la requete
if(!$query) return $query_result;
// la saisie est splitée en un tableau
$tab = pmb_split('/\s+/', $query);
// on cherche à détecter les mots de moins de 4 caractères (stop words)
// si il y des mots remplissant cette condition, c'est la méthode regexp qui sera employée
foreach($tab as $dummykey=>$word) {
if(pmb_strlen($word) < 4) {
$stopwords = TRUE;
break;
}
}
if($stopwords || $force_regexp) {
// méthode REGEXP
$query_result['type'] = 2;
// constitution du membre restricteur
// premier mot
if ($n_res) $query_result['restr'] = "( n_resume REGEXP '${tab[0]}' OR n_contenu REGEXP '${tab[0]}' ";
else $query_result['restr'] = "";
if ($n_gen) {
if ($query_result['restr']) $query_result['restr'].=" OR n_gen REGEXP '${tab[0]}'";
else $query_result['restr']= "( n_gen REGEXP '${tab[0]}'";
}
if ($n_tit) {
if ($query_result['restr']) $query_result['restr'].=" OR tit1 REGEXP '${tab[0]}' OR tit2 REGEXP '${tab[0]}' OR tit3 REGEXP '${tab[0]}' OR tit4 REGEXP '${tab[0]}' OR index_serie REGEXP '${tab[0]}'";
else $query_result['restr']= "( tit1 REGEXP '${tab[0]}' OR tit2 REGEXP '${tab[0]}' OR tit3 REGEXP '${tab[0]}' OR tit4 REGEXP '${tab[0]}' OR index_serie REGEXP '${tab[0]}' ";
}
if ($n_mat) {
if ($query_result['restr']) $query_result['restr'].=" OR index_l REGEXP '${tab[0]}' ";
else $query_result['restr']= "( index_l REGEXP '${tab[0]}' ";
}
$query_result['restr'].=") ";
//$query_result['restr'] = "(n_resume REGEXP '${tab[0]}'";
//$query_result['restr'] .= " OR n_contenu REGEXP '$tab[0]')";
$query_result['display'] = $tab[0];
$nb_tabs = count($tab);
for ($i = 1; $i < $nb_tabs; $i++) {
$query_suite="";
if ($n_res) $query_suite = " ( n_resume REGEXP '${tab[$i]}' OR n_contenu REGEXP '${tab[$i]}' ";
if ($n_gen) {
if ($query_suite) $query_suite.=" OR n_gen REGEXP '${tab[$i]}'";
else $query_suite= "( n_gen REGEXP '${tab[$i]}'";
}
if ($n_tit) {
if ($query_suite) $query_suite.=" OR tit1 REGEXP '${tab[$i]}' OR tit2 REGEXP '${tab[$i]}' OR tit3 REGEXP '${tab[$i]}' OR tit4 REGEXP '${tab[$i]}' OR index_serie REGEXP '${tab[$i]}'";
else $query_suite= "( tit1 REGEXP '${tab[$i]}' OR tit2 REGEXP '${tab[$i]}' OR tit3 REGEXP '${tab[$i]}' OR tit4 REGEXP '${tab[$i]}' OR index_serie REGEXP '${tab[$i]}' ";
}
if ($n_mat) {
if ($query_suite) $query_suite.=" OR index_l REGEXP '${tab[$i]}' ";
else $query_suite= "( index_l REGEXP '${tab[$i]}' ";
}
if ($query_suite) {
$query_suite.=" ) ";
$query_result['restr'] .= " $dopt ".$query_suite ;
}
//$query_result['restr'] .= " $dopt (n_resume REGEXP '${tab[$i]}'";
//$query_result['restr'] .= " OR n_contenu REGEXP '${tab[$i]}')";
$query_result['display'] .= " $dopt ${tab[$i]}";
}
//echo "
".$query_result['restr']."
";
// contitution de la clause de tri
$query_result['order'] = "index_serie ASC, tnvol ASC, index_sew ASC";
} else {
// méthode FULLTEXT
$query_result['type'] = 1;
// membre restricteur
if ($n_res) $query_result['restr'] = "( MATCH (n_resume, n_contenu) AGAINST ('${tab[0]}') ";
else $query_result['restr'] = "";
if ($n_gen) {
if ($query_result['restr']) $query_result['restr'].=" OR MATCH (n_gen) AGAINST ('${tab[0]}') ";
else $query_result['restr']= "( MATCH (n_gen) AGAINST ('${tab[0]}') ";
}
if ($n_tit) {
if ($query_result['restr']) $query_result['restr'].=" OR MATCH (index_wew) AGAINST ('${tab[0]}') ";
else $query_result['restr']= "( MATCH (index_wew) AGAINST ('${tab[0]}') ";
}
if ($n_mat) {
if ($query_result['restr']) $query_result['restr'].=" OR MATCH (index_matieres) AGAINST ('${tab[0]}') ";
else $query_result['restr']= "( MATCH (index_matieres) AGAINST ('${tab[0]}') ";
}
$query_result['restr'].=") ";
//$query_result['restr'] = "MATCH (n_resume, n_contenu) AGAINST ('${tab[0]}')";
$query_result['display'] = $tab[0];
$nb_tabs = count($tab);
for ($i = 1; $i < $nb_tabs; $i++) {
$query_suite="";
if ($n_res) $query_suite = " ( MATCH (n_resume, n_contenu) AGAINST ('${tab[$i]}') ";
if ($n_gen) {
if ($query_suite) $query_suite.=" OR MATCH (n_gen) AGAINST ('${tab[$i]}') ";
else $query_suite= "( MATCH (n_gen) AGAINST ('${tab[$i]}')";
}
if ($n_tit) {
if ($query_suite) $query_suite.=" OR MATCH (index_wew) AGAINST ('${tab[$i]}') ";
else $query_suite= "( MATCH (index_wew) AGAINST ('${tab[$i]}') ";
}
if ($n_mat) {
if ($query_suite) $query_suite.=" OR MATCH (index_matieres) AGAINST ('${tab[$i]}') ";
else $query_suite= "( MATCH (index_matieres) AGAINST ('${tab[$i]}') ";
}
if ($query_suite) {
$query_suite.=" ) ";
$query_result['restr'] .= " $dopt ".$query_suite ;
}
//$query_result['restr'] .= " $dopt MATCH";
//$query_result['restr'] .= " (n_resume, n_contenu)";
//$query_result['restr'] .= " AGAINST ('${tab[$i]}')";
$query_result['display'] .= " $dopt ${tab[$i]}";
}
// membre de tri
$query_result['order'] = "index_serie ASC, tnvol ASC, index_sew ASC";
}
}
// récupération du nombre de lignes
$rws = "SELECT count(1) FROM notices WHERE ${query_result['restr']}";
$result = @pmb_mysql_query($rws, $dbh);
$query_result['nbr_rows'] = pmb_mysql_result($result, 0, 0);
return $query_result;
}