source: pmb4.1/trunk/fuentes/pmb/catalog/notices/search/others/make_object.inc.php @ 478

Last change on this file since 478 was 478, checked in by mabarracus, 4 years ago

copy trusty code 4.1

  • Property svn:executable set to *
File size: 8.6 KB
Line 
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
7if (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é
13function 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        }
Note: See TracBrowser for help on using the repository browser.