1 | <?php |
---|
2 | // +-------------------------------------------------+ |
---|
3 | // © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net) |
---|
4 | // +-------------------------------------------------+ |
---|
5 | // $Id: make_object.inc.php,v 1.10 2009-05-16 11:12:04 dbellamy Exp $ |
---|
6 | |
---|
7 | if (stristr($_SERVER['REQUEST_URI'], ".inc.php")) die("no access"); |
---|
8 | |
---|
9 | // ---------------------------------------------------------------------------- |
---|
10 | // test_other_query() : analyse d'une rech. sur zones de notes |
---|
11 | // ---------------------------------------------------------------------------- |
---|
12 | // Armelle : a priori plus utilisé |
---|
13 | function test_other_query($n_res=0, $n_gen=0, $n_tit=0, $n_mat=0, $query, $operator=TRUE, $force_regexp=FALSE) { |
---|
14 | // fonction d'analyse d'une recherche sur titre |
---|
15 | // la fonction retourne un tableau : |
---|
16 | |
---|
17 | $query_result = array( 'type' => 0, |
---|
18 | 'restr' => '', |
---|
19 | 'order' => '', |
---|
20 | 'display', |
---|
21 | 'nbr_rows' => 0); |
---|
22 | |
---|
23 | // $query_result['type'] = type de la requête : |
---|
24 | // 0 : rien (problème) |
---|
25 | // 1: match/against |
---|
26 | // 2: regexp |
---|
27 | // 3: regexp pure sans traitement |
---|
28 | // $query_result['restr'] = critères de restriction |
---|
29 | // $query_result['order'] = critères de tri |
---|
30 | // $query_result['nbr_rows'] = nombre de lignes qui matchent |
---|
31 | // $query_result['display'] = affichage en clair de la requête utilisateur |
---|
32 | // si operator TRUE La recherche est booléenne AND |
---|
33 | // si operator FALSE La recherche est booléenne OR |
---|
34 | // si force_regexp : la recherche est forcée en mode regexp |
---|
35 | |
---|
36 | $stopwords = FALSE; |
---|
37 | global $dbh; |
---|
38 | |
---|
39 | // initialisation opérateur |
---|
40 | $operator ? $dopt = 'AND' : $dopt = 'OR'; |
---|
41 | |
---|
42 | $query = pmb_strtolower($query); |
---|
43 | |
---|
44 | // espaces en début et fin |
---|
45 | $query = pmb_preg_replace('/^\s+|\s+$/', '', $query); |
---|
46 | |
---|
47 | // espaces en double |
---|
48 | $query = pmb_preg_replace('/\s+/', ' ', $query); |
---|
49 | |
---|
50 | // contrôle de la requete |
---|
51 | if(!$query) return $query_result; |
---|
52 | |
---|
53 | // déterminer si la requête est une regexp |
---|
54 | // si c'est le cas, on utilise la saisie utilisateur sans modification |
---|
55 | // (on part du principe qu'il sait ce qu'il fait) |
---|
56 | |
---|
57 | if(pmb_preg_match('/\^|\$|\[|\]|\.|\*|\{|\}|\|/', $query)) { |
---|
58 | // regexp pure : pas de modif de la saisie utilisateur |
---|
59 | $query_result['type'] = 3; |
---|
60 | if ($n_res) $query_result['restr'] = "n_resume REGEXP '$query' OR n_contenu REGEXP '$query' "; |
---|
61 | else $query_result['restr'] = ""; |
---|
62 | if ($n_gen) { |
---|
63 | if ($query_result['restr']) $query_result['restr'].=" OR "; |
---|
64 | $query_result['restr'].= " n_gen REGEXP '$query'"; |
---|
65 | } |
---|
66 | if ($n_tit) { |
---|
67 | if ($query_result['restr']) $query_result['restr'].=" OR "; |
---|
68 | $query_result['restr'].= " tit1 REGEXP '$query' OR tit2 REGEXP '$query' OR tit3 REGEXP '$query' OR tit4 REGEXP '$query' OR index_serie REGEXP '$query' "; |
---|
69 | } |
---|
70 | if ($n_mat) { |
---|
71 | if ($query_result['restr']) $query_result['restr'].=" OR "; |
---|
72 | $query_result['restr'].= " index_l REGEXP '$query' "; |
---|
73 | } |
---|
74 | $query_result['order'] = "index_serie ASC, tnvol ASC, index_sew ASC"; |
---|
75 | $query_result['display'] = $query; |
---|
76 | } else { |
---|
77 | // nettoyage de la chaîne |
---|
78 | $query = pmb_preg_replace("/[\(\)\,\;\'\!\-\+]/", ' ', $query); |
---|
79 | |
---|
80 | // on supprime les mots vides |
---|
81 | $query = strip_empty_words($query); |
---|
82 | |
---|
83 | // contrôle de la requete |
---|
84 | if(!$query) return $query_result; |
---|
85 | |
---|
86 | // la saisie est splitée en un tableau |
---|
87 | $tab = pmb_split('/\s+/', $query); |
---|
88 | |
---|
89 | // on cherche à détecter les mots de moins de 4 caractères (stop words) |
---|
90 | // si il y des mots remplissant cette condition, c'est la méthode regexp qui sera employée |
---|
91 | foreach($tab as $dummykey=>$word) { |
---|
92 | if(pmb_strlen($word) < 4) { |
---|
93 | $stopwords = TRUE; |
---|
94 | break; |
---|
95 | } |
---|
96 | } |
---|
97 | |
---|
98 | if($stopwords || $force_regexp) { |
---|
99 | // méthode REGEXP |
---|
100 | $query_result['type'] = 2; |
---|
101 | // constitution du membre restricteur |
---|
102 | // premier mot |
---|
103 | if ($n_res) $query_result['restr'] = "( n_resume REGEXP '${tab[0]}' OR n_contenu REGEXP '${tab[0]}' "; |
---|
104 | else $query_result['restr'] = ""; |
---|
105 | if ($n_gen) { |
---|
106 | if ($query_result['restr']) $query_result['restr'].=" OR n_gen REGEXP '${tab[0]}'"; |
---|
107 | else $query_result['restr']= "( n_gen REGEXP '${tab[0]}'"; |
---|
108 | } |
---|
109 | if ($n_tit) { |
---|
110 | 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]}'"; |
---|
111 | 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]}' "; |
---|
112 | } |
---|
113 | if ($n_mat) { |
---|
114 | if ($query_result['restr']) $query_result['restr'].=" OR index_l REGEXP '${tab[0]}' "; |
---|
115 | else $query_result['restr']= "( index_l REGEXP '${tab[0]}' "; |
---|
116 | } |
---|
117 | $query_result['restr'].=") "; |
---|
118 | |
---|
119 | //$query_result['restr'] = "(n_resume REGEXP '${tab[0]}'"; |
---|
120 | //$query_result['restr'] .= " OR n_contenu REGEXP '$tab[0]')"; |
---|
121 | $query_result['display'] = $tab[0]; |
---|
122 | for ($i = 1; $i < sizeof($tab); $i++) { |
---|
123 | $query_suite=""; |
---|
124 | if ($n_res) $query_suite = " ( n_resume REGEXP '${tab[$i]}' OR n_contenu REGEXP '${tab[$i]}' "; |
---|
125 | if ($n_gen) { |
---|
126 | if ($query_suite) $query_suite.=" OR n_gen REGEXP '${tab[$i]}'"; |
---|
127 | else $query_suite= "( n_gen REGEXP '${tab[$i]}'"; |
---|
128 | } |
---|
129 | if ($n_tit) { |
---|
130 | 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]}'"; |
---|
131 | 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]}' "; |
---|
132 | } |
---|
133 | if ($n_mat) { |
---|
134 | if ($query_suite) $query_suite.=" OR index_l REGEXP '${tab[$i]}' "; |
---|
135 | else $query_suite= "( index_l REGEXP '${tab[$i]}' "; |
---|
136 | } |
---|
137 | if ($query_suite) { |
---|
138 | $query_suite.=" ) "; |
---|
139 | $query_result['restr'] .= " $dopt ".$query_suite ; |
---|
140 | } |
---|
141 | |
---|
142 | //$query_result['restr'] .= " $dopt (n_resume REGEXP '${tab[$i]}'"; |
---|
143 | //$query_result['restr'] .= " OR n_contenu REGEXP '${tab[$i]}')"; |
---|
144 | $query_result['display'] .= " $dopt ${tab[$i]}"; |
---|
145 | } |
---|
146 | //echo "<br /><br /><br />".$query_result['restr']."<br /><br /><br />"; |
---|
147 | // contitution de la clause de tri |
---|
148 | $query_result['order'] = "index_serie ASC, tnvol ASC, index_sew ASC"; |
---|
149 | } else { |
---|
150 | // méthode FULLTEXT |
---|
151 | $query_result['type'] = 1; |
---|
152 | // membre restricteur |
---|
153 | if ($n_res) $query_result['restr'] = "( MATCH (n_resume, n_contenu) AGAINST ('${tab[0]}') "; |
---|
154 | else $query_result['restr'] = ""; |
---|
155 | if ($n_gen) { |
---|
156 | if ($query_result['restr']) $query_result['restr'].=" OR MATCH (n_gen) AGAINST ('${tab[0]}') "; |
---|
157 | else $query_result['restr']= "( MATCH (n_gen) AGAINST ('${tab[0]}') "; |
---|
158 | } |
---|
159 | if ($n_tit) { |
---|
160 | if ($query_result['restr']) $query_result['restr'].=" OR MATCH (index_wew) AGAINST ('${tab[0]}') "; |
---|
161 | else $query_result['restr']= "( MATCH (index_wew) AGAINST ('${tab[0]}') "; |
---|
162 | } |
---|
163 | if ($n_mat) { |
---|
164 | if ($query_result['restr']) $query_result['restr'].=" OR MATCH (index_matieres) AGAINST ('${tab[0]}') "; |
---|
165 | else $query_result['restr']= "( MATCH (index_matieres) AGAINST ('${tab[0]}') "; |
---|
166 | } |
---|
167 | $query_result['restr'].=") "; |
---|
168 | |
---|
169 | //$query_result['restr'] = "MATCH (n_resume, n_contenu) AGAINST ('${tab[0]}')"; |
---|
170 | $query_result['display'] = $tab[0]; |
---|
171 | for ($i = 1; $i < sizeof($tab); $i++) { |
---|
172 | $query_suite=""; |
---|
173 | if ($n_res) $query_suite = " ( MATCH (n_resume, n_contenu) AGAINST ('${tab[$i]}') "; |
---|
174 | if ($n_gen) { |
---|
175 | if ($query_suite) $query_suite.=" OR MATCH (n_gen) AGAINST ('${tab[$i]}') "; |
---|
176 | else $query_suite= "( MATCH (n_gen) AGAINST ('${tab[$i]}')"; |
---|
177 | } |
---|
178 | if ($n_tit) { |
---|
179 | if ($query_suite) $query_suite.=" OR MATCH (index_wew) AGAINST ('${tab[$i]}') "; |
---|
180 | else $query_suite= "( MATCH (index_wew) AGAINST ('${tab[$i]}') "; |
---|
181 | } |
---|
182 | if ($n_mat) { |
---|
183 | if ($query_suite) $query_suite.=" OR MATCH (index_matieres) AGAINST ('${tab[$i]}') "; |
---|
184 | else $query_suite= "( MATCH (index_matieres) AGAINST ('${tab[$i]}') "; |
---|
185 | } |
---|
186 | if ($query_suite) { |
---|
187 | $query_suite.=" ) "; |
---|
188 | $query_result['restr'] .= " $dopt ".$query_suite ; |
---|
189 | } |
---|
190 | //$query_result['restr'] .= " $dopt MATCH"; |
---|
191 | //$query_result['restr'] .= " (n_resume, n_contenu)"; |
---|
192 | //$query_result['restr'] .= " AGAINST ('${tab[$i]}')"; |
---|
193 | $query_result['display'] .= " $dopt ${tab[$i]}"; |
---|
194 | } |
---|
195 | // membre de tri |
---|
196 | $query_result['order'] = "index_serie ASC, tnvol ASC, index_sew ASC"; |
---|
197 | } |
---|
198 | } |
---|
199 | |
---|
200 | // récupération du nombre de lignes |
---|
201 | $rws = "SELECT count(1) FROM notices WHERE ${query_result['restr']}"; |
---|
202 | $result = @mysql_query($rws, $dbh); |
---|
203 | $query_result['nbr_rows'] = mysql_result($result, 0, 0); |
---|
204 | |
---|
205 | return $query_result; |
---|
206 | |
---|
207 | } |
---|