Subversion Repositories Applications.referentiel

Rev

Rev 71 | Rev 79 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 71 Rev 72
Line 2... Line 2...
2
/**
2
/**
3
 * Service fournissant des informations sur les référentiels répondant aux critères de recherche
3
 * Service fournissant des informations sur les référentiels répondant aux critères de recherche
4
 * fournis en paramètre.
4
 * fournis en paramètre.
5
 * Encodage en entrée : utf8
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
6
 * Encodage en sortie : utf8
7
 * 
-
 
-
 
7
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
8
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
8
 * @author 		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
9
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
10
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
10
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
11
 * @version $Id$
11
 * @version		$Id$
12
 * @copyright	2010 Tela-Botanica
12
 * @copyright	2010 Tela-Botanica
13
 */
13
 */
-
 
14
 
14
class Recherche extends Ref {
15
class Recherche extends Ref {
Line 15... Line 16...
15
 
16
 
16
	/**
17
	/**
17
	 * Méthode principale appelée avec une requête de type GET.
18
	 * Méthode principale appelée avec une requête de type GET.
18
	 * Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
19
	 * Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
19
	 */
20
	 */
20
	public function getElement($param = array()) {
21
	public function getElement($param = array()) {
21
		// Initialisation des variables
22
		// Initialisation des variables
Line 22... Line 23...
22
		$info = array();
23
		$info = array();
23
				
24
				
Line 24... Line 25...
24
		// Nour recherchons le type de requête demandé
25
		// Nous recherchons le type de requête demandé
25
		$type = $param[0];
26
		$type = $param[0];
26
				 
27
				 
Line 34... Line 35...
34
		
35
		
35
		// Envoie sur la sortie standard
36
		// Envoie sur la sortie standard
36
		$this->envoyer($info);
37
		$this->envoyer($info);
Line 37... Line 38...
37
	}
38
	}
-
 
39
	
-
 
40
/* Méthode pour récupérer le nombre de taxons répondant à la requête
-
 
41
	 * Appelée avec les paramètres d'url suivant :
-
 
42
	 * /Recherche/Nombre/_
-
 
43
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
-
 
44
	 * Si un des paramètres est absent, il prendre la valeur *
-
 
45
	 */
-
 
46
	public function getElementNombre($param) {
-
 
47
		// Initialisation des variables
-
 
48
		$info = array();
-
 
49
				
-
 
50
		// Pré traitement des paramètres
-
 
51
		$p = $this->pretraiterParametresUrl($param);
-
 
52
		$referentiel = substr($p['ref'], 2, -2); 
-
 
53
 
-
 
54
		// Construction de la requête
-
 
55
		// Il est important de compter le nombre de taxons pour l'affichage
-
 
56
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(num_nom) AS nbre FROM '.$referentiel.
-
 
57
					$this->construireWhere($p).' ';
-
 
58
 
-
 
59
		// Récupération des résultats
-
 
60
		try {
-
 
61
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
-
 
62
			if ($donnees === false) {
-
 
63
				$this->messages[] = "La requête a retourné aucun résultat.";
-
 
64
			} else {
-
 
65
				$info = $donnees['nbre'];
-
 
66
			}
-
 
67
		} catch (PDOException $e) {
-
 
68
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
38
	
69
		}
-
 
70
 
-
 
71
		return $info;
-
 
72
	}
39
 	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
73
	
40
 	 * restrictions.
74
 	/* Méthode pour récupérer une liste de taxons
41
	 * Appelée avec les paramêtres d'url suivant :
75
	 * Appelée avec les paramêtres d'url suivant :
42
	 * /CoelRecherche/ParDefaut/_
76
	 * /Recherche/ParDefaut/_
43
	 * ou les _ représentent dans l'ordre : mots
77
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
44
	 * Si un des paramêtres est abscent, il prendre la valeur *
78
	 * Si un des paramètres est absent, il prendre la valeur *
45
	 */
79
	 */
46
	public function getElementParDefaut($param) {
80
	public function getElementParDefaut($param) {
Line 47... Line 81...
47
		// Initialisation des variables
81
		// Initialisation des variables
48
		$info = array();
82
		$info = array();
49
				
83
				
Line 50... Line 84...
50
		// Pré traitement des paramêtres
84
		// Pré traitement des paramètres
51
		$p = $this->pretraiterParametresUrl($param);
-
 
52
		$referentiel = substr($p['ref'], 2, -2); 
-
 
53
		
-
 
54
		// Construction de la requête
-
 
55
		if (isset($p['tax']) && $p['tax'] == true) {
-
 
56
			$requete_synonyme =	'SELECT DISTINCT num_nom_retenu FROM '.$referentiel.
-
 
57
					$this->construireFromEtWhere($p).';';
-
 
58
			try {
-
 
59
				$info = '';
-
 
60
				$donnees_synonyme = $this->bdd->query($requete_synonyme)->fetchAll(PDO::FETCH_ASSOC);
-
 
61
				
-
 
62
				if ($donnees_synonyme === false) {
-
 
63
					$this->messages[] = "La requête a retourné aucun résultat.";
-
 
64
				} else{
-
 
65
					$liste_nom = '';
-
 
66
					foreach ($donnees_synonyme as $donnees_syn) {
-
 
67
						if ($donnees_syn['num_nom_retenu'] != '') {
-
 
68
							$liste_nom .= (!empty($liste_nom) ? ', ' : '').'"'.$donnees_syn['num_nom_retenu'].'"';
-
 
69
						}
-
 
70
					}
-
 
71
					
-
 
72
					$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_complet, auteur, annee, '.
-
 
73
					'biblio_origine, nom_addendum, num_nom_retenu FROM '.$referentiel.' WHERE num_nom_retenu IN ('.$liste_nom.') '.
-
 
74
					'ORDER BY num_nom_retenu '."LIMIT $this->start, $this->limit ";
-
 
75
					$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
76
					$info = $donnees;
-
 
77
				}
-
 
78
			} catch (PDOException $e) {
-
 
79
				$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
-
 
80
			}
-
 
81
			return $info;
85
		$p = $this->pretraiterParametresUrl($param);
82
			
86
		$referentiel = substr($p['ref'], 2, -2); 
83
			
-
 
84
		} else {		
87
		
85
			$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_complet, auteur, annee, '.
88
		// Construction de la requête		
Line 86... Line 89...
86
					'biblio_origine, nom_addendum, num_nom_retenu FROM '.$referentiel.
89
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_complet, auteur, annee, '.
87
					$this->construireFromEtWhere($p).
90
				'biblio_origine, nom_addendum, num_nom_retenu FROM '.$referentiel.$this->construireWhere($p).
88
					'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'num_nom ASC, nom_complet ASC').' '.
91
				'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'num_nom ASC, nom_complet ASC').' '.
89
					"LIMIT $this->start, $this->limit ";
92
				"LIMIT $this->start, $this->limit ";
90
					
93
					
91
			// Récupération des résultats
94
		// Récupération des résultats
92
			try {
95
		try {
93
				$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
94
				if ($donnees === false) {
-
 
95
					$this->messages[] = "La requête a retourné aucun résultat.";
-
 
96
				} else {
96
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
97
					$info = $donnees;
97
			if ($donnees === false) {
-
 
98
				$this->messages[] = "La requête a retourné aucun résultat.";
98
				}
99
			} else {
-
 
100
				$info = $donnees;
99
			} catch (PDOException $e) {
101
			}
Line -... Line 102...
-
 
102
		} catch (PDOException $e) {
100
				$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
103
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
101
			}
-
 
102
			return $info;
104
		}
103
		}
105
		return $info;
104
	}
106
	}
105
	
107
	
106
	/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
108
	
107
 	 * restrictions.
109
	/* Méthode pour récupérer le nombre de taxons répondant à une requête sur la synonymie
108
	 * Appelée avec les paramêtres d'url suivant :
110
	 * Appelée avec les paramètres d'url suivant :
109
	 * /CoelRecherche/ParDefaut/_
111
	 * /Recherche/Nombre/_
Line 110... Line 112...
110
	 * ou les _ représentent dans l'ordre : mots
112
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
111
	 * Si un des paramêtres est abscent, il prendre la valeur *
113
	 * Si un des paramètres est absent, il prendre la valeur *
112
	 */
114
	 */
Line -... Line 115...
-
 
115
	public function getElementNombreTaxon($param) {
113
	public function getElementNombre($param) {
116
		// Initialisation des variables
114
		// Initialisation des variables
117
		$info = array();
115
		$info = array();
118
				
116
				
-
 
Line 117... Line 119...
117
		// Pré traitement des paramêtres
119
		// Pré traitement des paramètres
118
		$p = $this->pretraiterParametresUrl($param);
120
		$p = $this->pretraiterParametresUrl($param);
119
		$referentiel = substr($p['ref'], 2, -2); 
121
		$referentiel = substr($p['ref'], 2, -2); 
120
 
122
 
121
		// Construction de la requête
123
		
122
		// Il est important de compter le nombre d'association structure-collection différentes pour obtenir le bon nombre
124
		// Construction de la requête
123
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(num_nom) AS nbre FROM '.$referentiel.
125
		// Il est important de compter le nombre de taxons pour l'affichage
124
					$this->construireFromEtWhere($p).' ';
126
		$requete = 	'SELECT count(DISTINCT num_nom_retenu) as nbr FROM '.$referentiel.$this->construireWhere($p).';';
125
 
127
 
126
		// Récupération des résultats
128
		// Récupération des résultats
127
		try {
129
		try {
Line 128... Line 130...
128
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
130
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
129
			if ($donnees === false) {
131
			if ($donnees === false) {
Line -... Line 132...
-
 
132
				$this->messages[] = "La requête a retourné aucun résultat.";
-
 
133
			} else {
-
 
134
				$info = $donnees['nbr'];
-
 
135
			}
-
 
136
		} catch (PDOException $e) {
-
 
137
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
-
 
138
		}
-
 
139
 
-
 
140
		return $info;
-
 
141
	}
-
 
142
	
-
 
143
 	/* Méthode pour récupérer une liste de taxons
-
 
144
	 * Appelée avec les paramêtres d'url suivant :
-
 
145
	 * /Recherche/ParDefaut/_
-
 
146
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
-
 
147
	 * Si un des paramètres est absent, il prendre la valeur *
-
 
148
	 */
-
 
149
	public function getElementParTaxon($param) {
-
 
150
		// Initialisation des variables
-
 
151
		$info = array();
-
 
152
				
-
 
153
		// Pré traitement des paramètres
-
 
154
		$p = $this->pretraiterParametresUrl($param);
-
 
155
		$referentiel = substr($p['ref'], 2, -2); 
-
 
156
		
-
 
157
		$liste_nom = $this->getNomRetenu($param);
-
 
158
		// Construction de la requête
-
 
159
		// si recherche des synonymes
-
 
160
		$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_complet, auteur, annee, '.
-
 
161
					'biblio_origine, nom_addendum, num_nom_retenu FROM '.$referentiel.' WHERE num_nom_retenu IN ('
-
 
162
					.$liste_nom.') ORDER BY num_nom ASC ';
-
 
163
		try {
-
 
164
			$info = '';
-
 
165
				$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
166
				$info = $donnees;
-
 
167
		} catch (PDOException $e) {
-
 
168
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
-
 
169
		}
-
 
170
		return $info;
-
 
171
	}
-
 
172
	
-
 
173
	/* Méthode pour récupérer une liste de noms retenus
-
 
174
	 */
-
 
175
	public function getNomRetenu($param) {
-
 
176
		// Initialisation des variables
-
 
177
		$info = array();
-
 
178
				
-
 
179
		// Pré traitement des paramètres
-
 
180
		$p = $this->pretraiterParametresUrl($param);
-
 
181
		$referentiel = substr($p['ref'], 2, -2); 
-
 
182
		
-
 
183
		// Construction de la requête
-
 
184
		// si recherche des synonymes
-
 
185
		$requete_nom_retenu =	'SELECT DISTINCT num_nom_retenu FROM '.$referentiel.$this->construireWhere($p)
-
 
186
			."ORDER BY num_nom ASC LIMIT $this->start, $this->limit ".';';
-
 
187
		try {
-
 
188
			$info = '';
-
 
189
			$donnees_nom_retenu = $this->bdd->query($requete_nom_retenu)->fetchAll(PDO::FETCH_ASSOC);
-
 
190
 
-
 
191
			if ($donnees_nom_retenu === false) {
-
 
192
				$this->messages[] = "La requête n'a retourné aucun résultat.";
-
 
193
			} else {
-
 
194
				$liste_nom = '';
-
 
195
				foreach ($donnees_nom_retenu as $donnees_nom) {
-
 
196
					if ($donnees_nom['num_nom_retenu'] != '') {
130
				$this->messages[] = "La requête a retourné aucun résultat.";
197
						$liste_nom .= (!empty($liste_nom) ? ', ' : '').'"'.$donnees_nom['num_nom_retenu'].'"';
131
			} else {
198
					}
132
				$info = $donnees['nbre'];
199
				}
133
			}
200
				$info = $liste_nom;
134
		} catch (PDOException $e) {
201
			}
135
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
202
		} catch (PDOException $e) {
136
		}
203
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
Line 158... Line 225...
158
		foreach ($params_passes as $param_passe => $type) {
225
		foreach ($params_passes as $param_passe => $type) {
159
			if (isset($p[$param_passe])) {
226
			if (isset($p[$param_passe])) {
160
				// Suppression des éventuels espaces en début et fin de chaine
227
				// Suppression des éventuels espaces en début et fin de chaine
161
				$valeur = trim($p[$param_passe]);
228
				$valeur = trim($p[$param_passe]);
Line 162... Line 229...
162
				
229
				
163
				// Type de paramêtre chaine
230
				// Type de paramètre chaine
164
				if ($type == 'str') {
231
				if ($type == 'str') {
165
					// Suppression des slash
232
					// Suppression des slash
Line 166... Line 233...
166
					$valeur = stripslashes($valeur);
233
					$valeur = stripslashes($valeur);
Line 171... Line 238...
171
					} else {
238
					} else {
172
						// Recherche de mots non liés
239
						// Recherche de mots non liés
173
						$mots = explode(' ', $valeur);
240
						$mots = explode(' ', $valeur);
174
						$valeur = '%'.implode ('%', $mots).'%';
241
						$valeur = '%'.implode ('%', $mots).'%';
175
					}
242
					}
176
					// Mise en place des quotes pour l'intérogation dans la bdd
243
					// Mise en place des quotes pour l'interrogation dans la bdd
177
					$valeur = $this->bdd->quote($valeur);
244
					$valeur = $this->bdd->quote($valeur);
178
				}
245
				}
179
				// Type de paramêtre booléen
246
				// Type de paramètre booléen
180
				if ($type == 'bool') {
247
				if ($type == 'bool') {
181
					if (preg_match('/^[0]$/', $valeur)) {
248
					if (preg_match('/^[0]$/', $valeur)) {
182
						$valeur = false;
249
						$valeur = false;
183
					} else if (preg_match('/^[1]$/', $valeur)) {
250
					} else if (preg_match('/^[1]$/', $valeur)) {
184
						$valeur = true;
251
						$valeur = true;
185
					} else {
252
					} else {
186
						$this->messages[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
253
						$this->messages[] = "Le paramètre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
187
						$valeur = null;
254
						$valeur = null;
188
					}
255
					}
Line 189... Line 256...
189
					
256
					
190
				}
257
				}
191
				// Type de paramêtre entier
258
				// Type de paramètre entier
192
				if ($type == 'int') {
259
				if ($type == 'int') {
193
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
260
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
194
						$this->messages[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
261
						$this->messages[] = "Le paramètre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
195
							"séparés par des virgules et non '$valeur'.";
262
							"séparés par des virgules et non '$valeur'.";
196
						$valeur = null;
263
						$valeur = null;
197
					}
264
					}
Line 202... Line 269...
202
		}
269
		}
Line 203... Line 270...
203
		
270
		
204
		return $p;
271
		return $p;
Line 205... Line 272...
205
	}
272
	}
206
	
273
	
207
	private function construireFromEtWhere($p) {
-
 
208
		// Initialisation de variables
-
 
209
		$from_et_where = '';
274
	private function construireWhere($p) {
Line 210... Line 275...
210
		//$from = "FROM ".$p['ref']." ";
275
		// Initialisation de variables
211
		$where = ' WHERE ';
276
		$where = ' WHERE ';
212
		
277
		
213
		// Construire from et where en fonction des paramêtres 
278
		// Construire where en fonction des paramêtres 
214
		if (isset($p['mots'])) {
279
		if (isset($p['mots'])) {
215
			$where .= 'AND ('.	
280
			$where .= 'AND ('.	
Line 258... Line 323...
258
		}
323
		}
259
		if (isset($p['sp'])) {
324
		if (isset($p['sp'])) {
260
			$where .= "AND epithete_sp LIKE {$p['sp']} ";
325
			$where .= "AND epithete_sp LIKE {$p['sp']} ";
261
		}
326
		}
262
		if (isset($p['ssp'])) {
327
		if (isset($p['ssp'])) {
263
			$where .= "AND epithete_sp LIKE {$p['sp']} ";
328
			$where .= "AND epithete_infra_sp LIKE {$p['ssp']} ";
264
		}
329
		}
265
		if (isset($p['au'])) {
330
		if (isset($p['au'])) {
266
			$where .= "AND auteur LIKE {$p['au']} ";
331
			$where .= "AND auteur LIKE {$p['au']} ";
267
		}
332
		}
268
		if (isset($p['an'])) {
333
		if (isset($p['an'])) {
Line 280... Line 345...
280
		
345
		
Line 281... Line 346...
281
		
346
		
282
		$where = str_replace('WHERE AND', ' WHERE ', $where);
347
		$where = str_replace('WHERE AND', ' WHERE ', $where);
283
		
348
		
284
		
-
 
285
		// Retour du From et Where associé
-
 
286
		if (count($p) == 0) {
-
 
287
			$from_et_where = "";
349
		
288
			//$from_et_where = $from;
350
		// Retour du Where associé
289
		} else {
351
		if (count($p) == 0) {
290
			$from_et_where = $where;//$from.$where;
352
			$where = "";
291
		}
353
		}
292
		return $from_et_where;
354
		return $where;