Subversion Repositories Applications.referentiel

Rev

Rev 284 | Rev 290 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 284 Rev 285
1
<?php
1
<?php
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
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
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
 
15
class Recherche extends Ref {
15
class Recherche extends Ref {
16
 
16
 
17
	/**
17
	/**
18
	 * 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.
19
	 * 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.
20
	 */
20
	 */
21
	public function getElement($param = array()) {
21
	public function getElement($param = array()) {
22
		// Initialisation des variables
22
		// Initialisation des variables
23
		$info = array();
23
		$info = array();
24
				
24
				
25
		// Nous recherchons le type de requête demandé
25
		// Nous recherchons le type de requête demandé
26
		$type = $param[0];
26
		$type = $param[0];
27
				 
27
				 
28
		$methode = 'getElement'.$type;
28
		$methode = 'getElement'.$type;
29
		if (method_exists($this, $methode)) {
29
		if (method_exists($this, $methode)) {
30
			array_shift($param);
30
			array_shift($param);
31
			$info = $this->$methode($param);
31
			$info = $this->$methode($param);
32
		} else {
32
		} else {
33
			$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
33
			$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
34
		}
34
		}
35
		
35
		
36
		// Envoie sur la sortie standard
36
		// Envoie sur la sortie standard
37
		$this->envoyer($info);
37
		$this->envoyer($info);
38
	}
38
	}
39
	
39
	
40
/* Méthode pour récupérer le nombre de taxons répondant à la requête
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 :
41
	 * Appelée avec les paramètres d'url suivant :
42
	 * /Recherche/Nombre/_
42
	 * /Recherche/Nombre/_
43
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
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 *
44
	 * Si un des paramètres est absent, il prendre la valeur *
45
	 */
45
	 */
46
	public function getElementNombre($param) {
46
	public function getElementNombre($param) {
47
		// Initialisation des variables
47
		// Initialisation des variables
48
		$info = array();
48
		$info = array();
49
				
49
				
50
		// Pré traitement des paramètres
50
		// Pré traitement des paramètres
51
		$p = $this->pretraiterParametresUrl($param);
51
		$p = $this->pretraiterParametresUrl($param);
52
		$referentiel = substr($p['ref'], 2, -2); 
52
		$referentiel = substr($p['ref'], 2, -2); 
53
 
53
 
54
		// Construction de la requête
54
		// Construction de la requête
55
		// Il est important de compter le nombre de taxons pour l'affichage
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.
56
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(num_nom) AS nbre FROM '.$referentiel.
57
					$this->construireWhere($p).' ';
57
					$this->construireWhere($p).' ';
58
 
58
 
59
		// Récupération des résultats
59
		// Récupération des résultats
60
		try {
60
		try {
61
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
61
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
62
			if ($donnees === false) {
62
			if ($donnees === false) {
63
				$this->messages[] = "La requête a retourné aucun résultat : $requete";
63
				$this->messages[] = "La requête a retourné aucun résultat : $requete";
64
			} else {
64
			} else {
65
				$info = $donnees['nbre'];
65
				$info = $donnees['nbre'];
66
			}
66
			}
67
		} catch (PDOException $e) {
67
		} catch (PDOException $e) {
68
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()).$requete;
68
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()).$requete;
69
		}
69
		}
70
 
70
 
71
		return $info;
71
		return $info;
72
	}
72
	}
73
	
73
	
74
 	/* Méthode pour récupérer une liste de taxons
74
 	/* Méthode pour récupérer une liste de taxons
75
	 * Appelée avec les paramêtres d'url suivant :
75
	 * Appelée avec les paramêtres d'url suivant :
76
	 * /Recherche/ParDefaut/_
76
	 * /Recherche/ParDefaut/_
77
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
77
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
78
	 * Si un des paramètres est absent, il prendre la valeur *
78
	 * Si un des paramètres est absent, il prendre la valeur *
79
	 */
79
	 */
80
	public function getElementParDefaut($param) {
80
	public function getElementParDefaut($param) {
81
		// Initialisation des variables
81
		// Initialisation des variables
82
		$info = array();
82
		$info = array();
83
				
83
				
84
		// Pré traitement des paramètres
84
		// Pré traitement des paramètres
85
		$p = $this->pretraiterParametresUrl($param);
85
		$p = $this->pretraiterParametresUrl($param);
86
		$referentiel = substr($p['ref'], 2, -2); 
86
		$referentiel = substr($p['ref'], 2, -2); 
87
		
87
		
88
		// Construction de la requête		
88
		// Construction de la requête		
89
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_sci, auteur, annee, '.
89
		$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_sci, auteur, annee, '.
90
				'biblio_origine, nom_addendum, num_nom_retenu, presence, exclure_taxref'.
90
				'biblio_origine, nom_addendum, num_nom_retenu, presence, exclure_taxref'.
91
				' FROM '.$referentiel.$this->construireWhere($p).
91
				' FROM '.$referentiel.$this->construireWhere($p).
92
				'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'nom_sci ASC').' '.
92
				'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'nom_sci ASC').' '.
93
				"LIMIT $this->start, $this->limit ";
93
				"LIMIT $this->start, $this->limit ";
94
					
94
					
95
		// Récupération des résultats
95
		// Récupération des résultats
96
		try {
96
		try {
97
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
97
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
98
			if ($donnees === false) {
98
			if ($donnees === false) {
99
				$this->messages[] = "La requête a retourné aucun résultat : $requete";
99
				$this->messages[] = "La requête a retourné aucun résultat : $requete";
100
			} else {
100
			} else {
101
				$info = $donnees;
101
				$info = $donnees;
102
			}
102
			}
103
		} catch (PDOException $e) {
103
		} catch (PDOException $e) {
104
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()).$requete;
104
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()).$requete;
105
		}
105
		}
106
		return $info;
106
		return $info;
107
	}
107
	}
108
	
108
	
109
	
109
	
110
	/* Méthode pour récupérer le nombre de taxons répondant à une requête sur la synonymie
110
	/* Méthode pour récupérer le nombre de taxons répondant à une requête sur la synonymie
111
	 * Appelée avec les paramètres d'url suivant :
111
	 * Appelée avec les paramètres d'url suivant :
112
	 * /Recherche/Nombre/_
112
	 * /Recherche/Nombre/_
113
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
113
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
114
	 * Si un des paramètres est absent, il prendre la valeur *
114
	 * Si un des paramètres est absent, il prendre la valeur *
115
	 */
115
	 */
116
	public function getElementNombreTaxon($param) {
116
	public function getElementNombreTaxon($param) {
117
		// Initialisation des variables
117
		// Initialisation des variables
118
		$info = array();
118
		$info = array();
119
				
119
				
120
		// Pré traitement des paramètres
120
		// Pré traitement des paramètres
121
		$p = $this->pretraiterParametresUrl($param);
121
		$p = $this->pretraiterParametresUrl($param);
122
		$referentiel = substr($p['ref'], 2, -2); 
122
		$referentiel = substr($p['ref'], 2, -2); 
123
 
123
 
124
		
124
		
125
		// Construction de la requête
125
		// Construction de la requête
126
		// Il est important de compter le nombre de taxons pour l'affichage
126
		// Il est important de compter le nombre de taxons pour l'affichage
127
		$requete = 	'SELECT count(DISTINCT num_nom_retenu) as nbr FROM '.$referentiel.$this->construireWhere($p).';';
127
		$requete = 	'SELECT count(DISTINCT num_nom_retenu) as nbr FROM '.$referentiel.$this->construireWhere($p).';';
128
 
128
 
129
		// Récupération des résultats
129
		// Récupération des résultats
130
		try {
130
		try {
131
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
131
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
132
			if ($donnees === false) {
132
			if ($donnees === false) {
133
				$this->messages[] = "La requête a retourné aucun résultat.";
133
				$this->messages[] = "La requête a retourné aucun résultat.";
134
			} else {
134
			} else {
135
				$info = $donnees['nbr'];
135
				$info = $donnees['nbr'];
136
			}
136
			}
137
		} catch (PDOException $e) {
137
		} catch (PDOException $e) {
138
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
138
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
139
		}
139
		}
140
 
140
 
141
		return $info;
141
		return $info;
142
	}
142
	}
143
	
143
	
144
 	/* Méthode pour récupérer une liste de taxons
144
 	/* Méthode pour récupérer une liste de taxons
145
	 * Appelée avec les paramêtres d'url suivant :
145
	 * Appelée avec les paramêtres d'url suivant :
146
	 * /Recherche/ParDefaut/_
146
	 * /Recherche/ParDefaut/_
147
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
147
	 * ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
148
	 * Si un des paramètres est absent, il prendre la valeur *
148
	 * Si un des paramètres est absent, il prendre la valeur *
149
	 */
149
	 */
150
	public function getElementParTaxon($param) {
150
	public function getElementParTaxon($param) {
151
		// Initialisation des variables
151
		// Initialisation des variables
152
		$info = '';
152
		$info = '';
153
				
153
				
154
		// Pré traitement des paramètres
154
		// Pré traitement des paramètres
155
		$p = $this->pretraiterParametresUrl($param);
155
		$p = $this->pretraiterParametresUrl($param);
156
		$referentiel = substr($p['ref'], 2, -2); 
156
		$referentiel = substr($p['ref'], 2, -2); 
157
		
157
		
158
		$liste_nom = $this->getNomRetenu($param);
158
		$liste_nom = $this->getNomRetenu($param);
159
		if ($liste_nom != '') {
159
		if ($liste_nom != '') {
160
			// Construction de la requête
160
			// Construction de la requête
161
			// si recherche des synonymes
161
			// si recherche des synonymes
162
			$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_sci, auteur, annee, '.
162
			$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' num_nom, nom_sci, auteur, annee, '.
163
						'biblio_origine, nom_addendum, num_nom_retenu, basionyme, synonyme_mal_applique, presence, exclure_taxref '.
163
						'biblio_origine, nom_addendum, num_nom_retenu, basionyme, synonyme_mal_applique, presence, exclure_taxref '.
164
							' FROM '.$referentiel.' WHERE num_nom_retenu IN ('.$liste_nom.') '.
164
							' FROM '.$referentiel.' WHERE num_nom_retenu IN ('.$liste_nom.') '.
165
							'ORDER BY nom_sci ASC '; 
165
							'ORDER BY nom_sci ASC '; 
166
			try {
166
			try {
167
				$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
167
				$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
168
				$info = $donnees;
168
				$info = $donnees;
169
			} catch (PDOException $e) {
169
			} catch (PDOException $e) {
170
				$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
170
				$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
171
			}
171
			}
172
		}
172
		}
173
		return $info;
173
		return $info;
174
		
174
		
175
	}
175
	}
-
 
176
	
-
 
177
	/**
-
 
178
	 *  Récupérer le nombre de taxons d'une classifiation (infra ou supra)
-
 
179
	 * Appelée avec les paramètres d'url suivant :
-
 
180
	* /Recherche/NombreClassif/_
-
 
181
	* ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés
-
 
182
	* Si un des paramètres est absent, il prendre la valeur *
-
 
183
	*/
-
 
184
	public function getElementNombreClassif($param) {
-
 
185
		// Initialisation des variables
-
 
186
		$info = array();
-
 
187
	
-
 
188
		// Pré traitement des paramètres
-
 
189
		$p = $this->pretraiterParametresUrl($param);
-
 
190
		$referentiel = substr($p['ref'], 2, -2);
-
 
191
	
-
 
192
		$requete = '';
-
 
193
		if (isset($p['classif'])) {
-
 
194
			if (!isset($p['nn'])) {
-
 
195
				$p['rg'] = 180;	
-
 
196
			}
-
 
197
			
-
 
198
			if ($p['classif'] == 'infra') {
-
 
199
				$requete = 'SELECT COUNT(num_nom) as nbr '.
-
 
200
						   'FROM '.$referentiel.' '.
-
 
201
						   'WHERE num_tax_sup IN '.
-
 
202
				           '(SELECT num_nom '.
-
 
203
						   'FROM '.$referentiel.$this->construireWhere($p).') ';
-
 
204
			} else {
-
 
205
				$requete = 'SELECT count(distinct num_tax_sup) as nbr '.
-
 
206
						'FROM '.$referentiel.$this->construireWhere($p).' ';
-
 
207
				
-
 
208
			}
-
 
209
				
-
 
210
		} else {
-
 
211
			// Construction de la requête
-
 
212
			// Il est important de compter le nombre de taxons pour l'affichage
-
 
213
			$requete = 	'SELECT count(DISTINCT num_nom_retenu) as nbr FROM '.$referentiel.$this->construireWhere($p).';';
-
 
214
		}
-
 
215
	
-
 
216
		// Récupération des résultats
-
 
217
		try {
-
 
218
			$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
-
 
219
		if ($donnees === false) {
-
 
220
			$this->messages[] = "La requête a retourné aucun résultat.";
-
 
221
			} else {
-
 
222
			$info = $donnees['nbr'];
-
 
223
			
-
 
224
		}
-
 
225
		} catch (PDOException $e) {
-
 
226
		$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
-
 
227
		}
-
 
228
	
-
 
229
		return $info;
-
 
230
		}
-
 
231
	
-
 
232
	/** 
-
 
233
	 * Récupérer la classification d'un taxon donné (ses enfants ou parents)
-
 
234
	 * Appelée avec les paramêtres d'url suivant :
-
 
235
	* /Recherche/Hierarchie/_
-
 
236
	* ou les _ représentent dans l'ordre : référentiel, mots, paramétres avancés (dont classif est le sens de la requête infra ou supra)
-
 
237
	* Si un des paramètres est absent, il prendre la valeur *
-
 
238
	*/
-
 
239
	public function getElementClassification($param) {
-
 
240
		
-
 
241
		$resultats = array();
-
 
242
		
-
 
243
		try {
-
 
244
			$p = $this->pretraiterParametresUrl($param);
-
 
245
			$referentiel = substr($p['ref'], 2, -2);
-
 
246
			$classif = $p['classif'];
-
 
247
			
-
 
248
			//Si on ne recherche pas sur un numéro taxonomique, on veut ne trouver que les familles
-
 
249
			if (!isset($p['nn'])) {
-
 
250
				$p['rg'] = 180;
-
 
251
			}
-
 
252
			
-
 
253
			// Récupérer les informations du nom sélectionné
-
 
254
			$requete = 	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').
-
 
255
						' num_nom, nom_sci, auteur, annee, biblio_origine, nom_addendum,'.
-
 
256
						' num_nom_retenu, presence, exclure_taxref, num_tax_sup'.
-
 
257
						' FROM '.$referentiel.$this->construireWhere($p).
-
 
258
						' ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'nom_sci ASC');
-
 
259
						
-
 
260
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
261
			
-
 
262
			if ($donnees === false) {
-
 
263
				$this->messages[] = "La requête a retourné aucun résultat : $requete";
-
 
264
			} else {
-
 
265
					
-
 
266
				if ($classif == 'infra') {
-
 
267
					$resultats = $this->trouverInfra($referentiel, $donnees);
-
 
268
				} else {
-
 
269
					$resultats = $this->trouverSupra($referentiel, $donnees);
-
 
270
				}
-
 
271
			}
-
 
272
		} catch (PDOException $e) {
-
 
273
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage()).$requete;
-
 
274
		}
-
 
275
		return $resultats;
-
 
276
	}
-
 
277
	
-
 
278
	/**
-
 
279
	 * Parcourir les données passées en paramètre pour trouver les taxons inférieurs
-
 
280
	 * @param $referentiel String le référentiel pour la requête
-
 
281
	 * @param $donnees Array un tableau de résultats contenant des lignes taxons
-
 
282
	 * @return un tableau de résultats contenant les taxons inférieurs
-
 
283
	 * */
-
 
284
	public function trouverInfra($referentiel, $donnees) {
-
 
285
		$donneesInfras = array();
-
 
286
		foreach ($donnees as $taxon) {
-
 
287
			
-
 
288
			$resultats = array();
-
 
289
			$requete =  'SELECT DISTINCT '.
-
 
290
					' num_nom, nom_sci, auteur, annee, biblio_origine, nom_addendum,'.
-
 
291
					' num_nom_retenu, presence, exclure_taxref'.
-
 
292
					' FROM '.$referentiel.
-
 
293
					' WHERE num_tax_sup = '.$taxon['num_nom'].' '.
-
 
294
					' ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'nom_sci ASC').' '.
-
 
295
					"LIMIT $this->start, $this->limit ";
-
 
296
				
-
 
297
			$donneesInfras = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
298
			
-
 
299
			if ($donneesInfras !== false) {
-
 
300
				$resultats = array_merge($resultats, $donneesInfras);
-
 
301
			}
-
 
302
		}
-
 
303
		
-
 
304
		return $donneesInfras;
-
 
305
	}
-
 
306
	
-
 
307
	/**
-
 
308
	 * Parcourir les données passées en paramètre pour trouver les taxons supérieurs
-
 
309
	 * @param $referentiel String le référentiel pour la requête
-
 
310
	 * @param $donnees Array un tableau de résultats contenant des lignes taxons
-
 
311
	 * @return un tableau de résultats contenant les taxons supérieurs
-
 
312
	 * */
-
 
313
	public function trouverSupra($referentiel, $donnees) {
-
 
314
			$resultats = array();
-
 
315
			$numNomSup = array();
-
 
316
					
-
 
317
			foreach ($donnees as $taxon) {
-
 
318
				$numNomSup[] = $taxon['num_tax_sup'];
-
 
319
			}
-
 
320
			
-
 
321
			// Récupérer les taxons supérieurs :
-
 
322
			$requete = 'SELECT DISTINCT '.
-
 
323
					' num_nom, nom_sci, auteur, annee, biblio_origine, nom_addendum,'.
-
 
324
					' num_nom_retenu, presence, exclure_taxref, num_tax_sup'.
-
 
325
					' FROM '.$referentiel.
-
 
326
					' WHERE num_nom IN ('.implode(',', $numNomSup).') '.
-
 
327
					' ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'nom_sci ASC').' '.
-
 
328
					"LIMIT $this->start, $this->limit ";
-
 
329
			
-
 
330
			$donneesSupras = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
-
 
331
				
-
 
332
			if ($donneesSupras !== false) {
-
 
333
				$resultats = $donneesSupras;
-
 
334
			}
-
 
335
			
-
 
336
			return $resultats;
-
 
337
	}
176
	
338
	
177
	/* Méthode pour récupérer une liste de noms retenus
339
	/* Méthode pour récupérer une liste de noms retenus
178
	 */
340
	 */
179
	public function getNomRetenu($param) {
341
	public function getNomRetenu($param) {
180
		// Initialisation des variables
342
		// Initialisation des variables
181
		$info = array();
343
		$info = array();
182
				
344
				
183
		// Pré traitement des paramètres
345
		// Pré traitement des paramètres
184
		$p = $this->pretraiterParametresUrl($param);
346
		$p = $this->pretraiterParametresUrl($param);
185
		$referentiel = substr($p['ref'], 2, -2); 
347
		$referentiel = substr($p['ref'], 2, -2); 
186
		
348
		
187
		// Construction de la requête
349
		// Construction de la requête
188
		// si recherche des synonymes
350
		// si recherche des synonymes
189
		$requete_nom_retenu =	'SELECT DISTINCT num_nom_retenu FROM '.$referentiel.$this->construireWhere($p)
351
		$requete_nom_retenu =	'SELECT DISTINCT num_nom_retenu FROM '.$referentiel.$this->construireWhere($p)
190
			."AND num_nom=num_nom_retenu ORDER BY nom_sci ASC LIMIT $this->start, $this->limit ".';';
352
			."AND num_nom=num_nom_retenu ORDER BY nom_sci ASC LIMIT $this->start, $this->limit ".';';
191
		try {
353
		try {
192
			$info = '';
354
			$info = '';
193
			$donnees_nom_retenu = $this->bdd->query($requete_nom_retenu)->fetchAll(PDO::FETCH_ASSOC);
355
			$donnees_nom_retenu = $this->bdd->query($requete_nom_retenu)->fetchAll(PDO::FETCH_ASSOC);
194
 
356
 
195
			if ($donnees_nom_retenu === false) {
357
			if ($donnees_nom_retenu === false) {
196
				$this->messages[] = "La requête n'a retourné aucun résultat.";
358
				$this->messages[] = "La requête n'a retourné aucun résultat.";
197
			} else {
359
			} else {
198
				$liste_nom = '';
360
				$liste_nom = '';
199
				foreach ($donnees_nom_retenu as $donnees_nom) {
361
				foreach ($donnees_nom_retenu as $donnees_nom) {
200
					if ($donnees_nom['num_nom_retenu'] != '') {
362
					if ($donnees_nom['num_nom_retenu'] != '') {
201
						$liste_nom .= (!empty($liste_nom) ? ', ' : '').'"'.$donnees_nom['num_nom_retenu'].'"';
363
						$liste_nom .= (!empty($liste_nom) ? ', ' : '').'"'.$donnees_nom['num_nom_retenu'].'"';
202
					}
364
					}
203
				}
365
				}
204
				$info = $liste_nom;
366
				$info = $liste_nom;
205
			}
367
			}
206
		} catch (PDOException $e) {
368
		} catch (PDOException $e) {
207
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
369
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
208
		}
370
		}
209
		return $info;
371
		return $info;
210
	}
372
	}
211
	
373
	
212
	private function pretraiterParametresUrl($param) {
374
	private function pretraiterParametresUrl($param) {
213
		// Tableau des paramètres qui peuvent être passés dans l'url
375
		// Tableau des paramètres qui peuvent être passés dans l'url
214
		$params_passes = array('ref' => 'str',
376
		$params_passes = array('ref' => 'str',
215
			'mots' => 'str',
377
			'mots' => 'str',
216
			'sg' => 'str_exact', 
378
			'sg' => 'str_exact', 
217
			'gen' => 'str_exact', 
379
			'gen' => 'str_exact', 
218
			'sp' => 'str_exact',
380
			'sp' => 'str_exact',
219
			'ssp' => 'str_exact',
381
			'ssp' => 'str_exact',
220
			'au' => 'str',
382
			'au' => 'str',
221
			'an' => 'str',
383
			'an' => 'str',
222
			'nn' => 'int',
384
			'nn' => 'int',
223
			'bib' => 'str',
385
			'bib' => 'str',
224
			'nr' => 'bool',
386
			'nr' => 'bool',
225
			'tax' => 'bool',
387
			'tax' => 'bool',
226
			'pre' => 'bool',
388
			'pre' => 'bool',
227
			'taxref' => 'bool');
389
			'taxref' => 'bool',
-
 
390
			'classif' => '',
-
 
391
			'rg' => 'int');
228
		
392
		
229
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
393
		$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
230
		//$this->debug[] = $param;
394
		//$this->debug[] = $param;
231
		foreach ($params_passes as $param_passe => $type) {
395
		foreach ($params_passes as $param_passe => $type) {
232
			if (isset($p[$param_passe])) {
396
			if (isset($p[$param_passe])) {
233
				// Suppression des éventuels espaces en début et fin de chaine
397
				// Suppression des éventuels espaces en début et fin de chaine
234
				$valeur = trim($p[$param_passe]);
398
				$valeur = trim($p[$param_passe]);
235
				
399
				
236
				// Type de paramètre chaine
400
				// Type de paramètre chaine
237
				if ($type == 'str') {
401
				if ($type == 'str') {
238
					// Suppression des slash
402
					// Suppression des slash
239
					$valeur = stripslashes($valeur);
403
					$valeur = stripslashes($valeur);
240
					
404
					
241
					// Utilisation d'une recherche de chaîne exacte
405
					// Utilisation d'une recherche de chaîne exacte
242
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
406
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
243
						$valeur = '%'.$match[1].'%';
407
						$valeur = '%'.$match[1].'%';
244
					} else {
408
					} else {
245
						// Recherche de mots non liés
409
						// Recherche de mots non liés
246
						$mots = explode(' ', $valeur);
410
						$mots = explode(' ', $valeur);
247
						$valeur = '%'.implode ('%', $mots).'%';
411
						$valeur = '%'.implode ('%', $mots).'%';
248
					}
412
					}
249
					// Mise en place des quotes pour l'interrogation dans la bdd
413
					// Mise en place des quotes pour l'interrogation dans la bdd
250
					$valeur = $this->bdd->quote($valeur);
414
					$valeur = $this->bdd->quote($valeur);
251
				}
415
				}
252
				// Type de paramètre chaine exacte
416
				// Type de paramètre chaine exacte
253
				if ($type == 'str_exact') {
417
				if ($type == 'str_exact') {
254
					// Suppression des slash
418
					// Suppression des slash
255
					$valeur = stripslashes($valeur);
419
					$valeur = stripslashes($valeur);
256
					
420
					
257
					// Utilisation d'une recherche de chaîne exacte
421
					// Utilisation d'une recherche de chaîne exacte
258
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
422
					if (preg_match('/^"(.*)"$/', $valeur, $match)) {
259
						$valeur = $match[1];
423
						$valeur = $match[1];
260
					} else {
424
					} else {
261
						// Recherche de mots non liés
425
						// Recherche de mots non liés
262
						$mots = explode(' ', $valeur);
426
						$mots = explode(' ', $valeur);
263
						$valeur = implode (' ', $mots);
427
						$valeur = implode (' ', $mots);
264
					}
428
					}
265
					// Mise en place des quotes pour l'interrogation dans la bdd
429
					// Mise en place des quotes pour l'interrogation dans la bdd
266
					$valeur = $this->bdd->quote($valeur);
430
					$valeur = $this->bdd->quote($valeur);
267
				}
431
				}
268
				// Type de paramètre booléen
432
				// Type de paramètre booléen
269
				if ($type == 'bool') {
433
				if ($type == 'bool') {
270
					if (preg_match('/^[0]$/', $valeur)) {
434
					if (preg_match('/^[0]$/', $valeur)) {
271
						$valeur = false;
435
						$valeur = false;
272
					} else if (preg_match('/^[1]$/', $valeur)) {
436
					} else if (preg_match('/^[1]$/', $valeur)) {
273
						$valeur = true;
437
						$valeur = true;
274
					} else {
438
					} else {
275
						$this->messages[] = "Le paramètre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
439
						$this->messages[] = "Le paramètre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
276
						$valeur = null;
440
						$valeur = null;
277
					}
441
					}
278
					
442
					
279
				}
443
				}
280
				// Type de paramètre entier
444
				// Type de paramètre entier
281
				if ($type == 'int') {
445
				if ($type == 'int') {
282
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
446
					if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
283
						$this->messages[] = "Le paramètre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
447
						$this->messages[] = "Le paramètre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
284
							"séparés par des virgules et non '$valeur'.";
448
							"séparés par des virgules et non '$valeur'.";
285
						$valeur = null;
449
						$valeur = null;
286
					}
450
					}
287
				}
451
				}
288
				
452
				
289
				$p[$param_passe] = $valeur;
453
				$p[$param_passe] = $valeur;
290
			}
454
			}
291
		}
455
		}
292
		
456
		
293
		return $p;
457
		return $p;
294
	}
458
	}
295
	
459
	
296
	private function construireWhere($p) {
460
	private function construireWhere($p) {
297
		// Initialisation de variables
461
		// Initialisation de variables
298
		$where = ' WHERE ';
462
		$where = ' WHERE ';
299
		
463
		
300
		// Construire where en fonction des paramêtres 
464
		// Construire where en fonction des paramêtres 
301
		if (isset($p['mots'])) {
465
		if (isset($p['mots'])) {
302
			$where .= 'AND ('.	
466
			$where .= 'AND ('.	
303
				" num_nom LIKE {$p['mots']} ".
467
				" num_nom LIKE {$p['mots']} ".
304
				" OR num_nom_retenu LIKE {$p['mots']} ".
468
				" OR num_nom_retenu LIKE {$p['mots']} ".
305
				" OR num_tax_sup LIKE {$p['mots']} ".
469
				" OR num_tax_sup LIKE {$p['mots']} ".
306
				" OR rang LIKE {$p['mots']} ".
470
				" OR rang LIKE {$p['mots']} ".
307
				" OR nom_sci LIKE {$p['mots']} ".
471
				" OR nom_sci LIKE {$p['mots']} ".
308
				" OR nom_supra_generique LIKE {$p['mots']} ".
472
				" OR nom_supra_generique LIKE {$p['mots']} ".
309
				" OR genre LIKE {$p['mots']} ".
473
				" OR genre LIKE {$p['mots']} ".
310
				" OR epithete_infra_generique LIKE {$p['mots']} ".
474
				" OR epithete_infra_generique LIKE {$p['mots']} ".
311
				" OR epithete_sp LIKE {$p['mots']} ".
475
				" OR epithete_sp LIKE {$p['mots']} ".
312
				" OR type_epithete LIKE {$p['mots']} ".
476
				" OR type_epithete LIKE {$p['mots']} ".
313
				" OR epithete_infra_sp LIKE {$p['mots']} ".
477
				" OR epithete_infra_sp LIKE {$p['mots']} ".
314
				" OR cultivar_groupe LIKE {$p['mots']} ".
478
				" OR cultivar_groupe LIKE {$p['mots']} ".
315
				" OR cultivar LIKE {$p['mots']} ".
479
				" OR cultivar LIKE {$p['mots']} ".
316
				" OR nom_commercial LIKE {$p['mots']} ".
480
				" OR nom_commercial LIKE {$p['mots']} ".
317
				" OR auteur LIKE {$p['mots']} ".
481
				" OR auteur LIKE {$p['mots']} ".
318
				" OR annee LIKE {$p['mots']} ".
482
				" OR annee LIKE {$p['mots']} ".
319
				" OR biblio_origine LIKE {$p['mots']} ".
483
				" OR biblio_origine LIKE {$p['mots']} ".
320
				" OR notes LIKE {$p['mots']} ".
484
				" OR notes LIKE {$p['mots']} ".
321
				" OR nom_addendum LIKE {$p['mots']} ".
485
				" OR nom_addendum LIKE {$p['mots']} ".
322
				" OR homonyme LIKE {$p['mots']} ".
486
				" OR homonyme LIKE {$p['mots']} ".
323
				" OR basionyme LIKE {$p['mots']} ".
487
				" OR basionyme LIKE {$p['mots']} ".
324
				" OR synonyme_proparte LIKE {$p['mots']} ".
488
				" OR synonyme_proparte LIKE {$p['mots']} ".
325
				" OR synonyme_douteux LIKE {$p['mots']} ".
489
				" OR synonyme_douteux LIKE {$p['mots']} ".
326
				" OR synonyme_mal_applique LIKE {$p['mots']} ".
490
				" OR synonyme_mal_applique LIKE {$p['mots']} ".
327
				" OR synonyme_orthographique LIKE {$p['mots']} ".
491
				" OR synonyme_orthographique LIKE {$p['mots']} ".
328
				" OR hybride_parent_01 LIKE {$p['mots']} ".
492
				" OR hybride_parent_01 LIKE {$p['mots']} ".
329
				" OR hybride_parent_01_notes LIKE {$p['mots']} ".
493
				" OR hybride_parent_01_notes LIKE {$p['mots']} ".
330
				" OR hybride_parent_02 LIKE {$p['mots']} ".
494
				" OR hybride_parent_02 LIKE {$p['mots']} ".
331
				" OR hybride_parent_02_notes LIKE {$p['mots']} ".
495
				" OR hybride_parent_02_notes LIKE {$p['mots']} ".
332
				" OR nom_francais LIKE {$p['mots']} ".
496
				" OR nom_francais LIKE {$p['mots']} ".
333
				" OR presence LIKE {$p['mots']} ".
497
				" OR presence LIKE {$p['mots']} ".
334
				" OR statut_origine LIKE {$p['mots']} ".
498
				" OR statut_origine LIKE {$p['mots']} ".
335
				" OR statut_introduction LIKE {$p['mots']} ".
499
				" OR statut_introduction LIKE {$p['mots']} ".
336
				" OR statut_culture LIKE {$p['mots']} ".
500
				" OR statut_culture LIKE {$p['mots']} ".
337
				') ';
501
				') ';
338
		}
502
		}
339
		if (isset($p['sg'])) {
503
		if (isset($p['sg'])) {
340
			$where .= "AND nom_supra_generique LIKE {$p['sg']} ";
504
			$where .= "AND nom_supra_generique LIKE {$p['sg']} ";
341
		}
505
		}
342
		if (isset($p['gen'])) {
506
		if (isset($p['gen'])) {
343
			$where .= "AND genre LIKE ({$p['gen']}) ";
507
			$where .= "AND genre LIKE ({$p['gen']}) ";
344
		}
508
		}
345
		if (isset($p['sp'])) {
509
		if (isset($p['sp'])) {
346
			$where .= "AND epithete_sp LIKE {$p['sp']} ";
510
			$where .= "AND epithete_sp LIKE {$p['sp']} ";
347
		}
511
		}
348
		if (isset($p['ssp'])) {
512
		if (isset($p['ssp'])) {
349
			$where .= "AND epithete_infra_sp LIKE {$p['ssp']} ";
513
			$where .= "AND epithete_infra_sp LIKE {$p['ssp']} ";
350
		}
514
		}
351
		if (isset($p['au'])) {
515
		if (isset($p['au'])) {
352
			$where .= "AND auteur LIKE {$p['au']} ";
516
			$where .= "AND auteur LIKE {$p['au']} ";
353
		}
517
		}
354
		if (isset($p['an'])) {
518
		if (isset($p['an'])) {
355
			$where .= "AND annee LIKE ({$p['an']}) ";
519
			$where .= "AND annee LIKE ({$p['an']}) ";
356
		}
520
		}
357
		if (isset($p['nn'])) {
521
		if (isset($p['nn'])) {
358
			$where .= "AND num_nom IN ({$p['nn']}) ";
522
			$where .= "AND num_nom IN ({$p['nn']}) ";
359
		}	
523
		}	
360
		if (isset($p['bib'])) {
524
		if (isset($p['bib'])) {
361
			$where .= "AND biblio_origine LIKE ({$p['bib']}) ";
525
			$where .= "AND biblio_origine LIKE ({$p['bib']}) ";
362
		}
526
		}
363
		if (isset($p['nr']) && $p['nr'] == true) {
527
		if (isset($p['nr']) && $p['nr'] == true) {
364
			$where .= "AND num_nom_retenu = num_nom ";
528
			$where .= "AND num_nom_retenu = num_nom ";
365
		}
529
		}
366
		if (isset($p['pre']) && $p['pre'] == true) {
530
		if (isset($p['pre']) && $p['pre'] == true) {
367
			$where .= "AND presence NOT IN ('A', '') ";
531
			$where .= "AND presence NOT IN ('A', '') ";
368
		} elseif(isset($p['pre']) && $p['pre'] != true) {
532
		} elseif(isset($p['pre']) && $p['pre'] != true) {
369
			$where .= "AND presence IN ('A', '') ";
533
			$where .= "AND presence IN ('A', '') ";
370
			
534
			
371
		}
535
		}
372
		if (isset($p['taxref'])) {
536
		if (isset($p['taxref'])) {
373
			$where .= "AND exclure_taxref =";
537
			$where .= "AND exclure_taxref =";
374
			$where .= ($p['taxref'] == true) ? " 0 " : " 1 ";
538
			$where .= ($p['taxref'] == true) ? " 0 " : " 1 ";
375
		}
539
		}
-
 
540
		
-
 
541
		if (isset($p['rg'])) {
-
 
542
			$where .= "AND rang = $p[rg] ";
-
 
543
		}
376
		
544
		
377
		
545
		
378
		$where = str_replace('WHERE AND', ' WHERE ', $where);
546
		$where = str_replace('WHERE AND', ' WHERE ', $where);
379
		
547
		
380
		
548
		
381
		// Retour du Where associé
549
		// Retour du Where associé
382
		if (count($p) == 0) {
550
		if (count($p) == 0) {
383
			$where = "";
551
			$where = "";
384
		}
552
		}
385
		return $where;
553
		return $where;
386
	}
554
	}
387
}
555
}
388
?>
556
?>