Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1648 Rev 1649
Line 1... Line 1...
1
<?php
1
<?php
2
 
-
 
3
/**
2
/**
4
* @category  PHP
3
* @category  PHP
5
* @package   jrest
4
* @package   jrest
6
* @author    Raphaël Droz <raphael@tela-botania.org>
5
* @author    Raphaël Droz <raphael@tela-botania.org>
7
* @copyright 2013 Tela-Botanica
6
* @copyright 2013 Tela-Botanica
Line 9... Line 8...
9
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
8
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
*/
9
*/
Line 11... Line 10...
11
 
10
 
12
/**
11
/**
13
 * Service d'import de données d'observation du CEL au format XLS
12
 * Service d'import de données d'observation du CEL au format XLS
-
 
13
 *
-
 
14
 * Sont define()'d commme n° de colonne tous les abbrevs retournés par
14
 */
15
 * ExportXLS::nomEnsembleVersListeColonnes() préfixés par C_  cf: detectionEntete()
-
 
16
 *
-
 
17
 * Exemple d'un test:
15
 
18
 * $ GET "/jrest/ExportXLS/22506?format=csv&range=*&limite=13" \
16
// sont define()'d commme n° de colonne tous les abbrevs retournés par ExportXLS::nomEnsembleVersListeColonnes()
19
 *   | curl -F "upload=@-" -F utilisateur=22506 "/jrest/ImportXLS"
-
 
20
 * # 13 observations importées
-
 
21
 * + cf MySQL general_log = 1
-
 
22
 *  
Line 17... Line 23...
17
// préfixés par C_  cf: detectionEntete()
23
 **/
18
 
24
 
19
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
25
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(realpath(__FILE__))) . '/lib');
20
// TERM
26
// TERM
Line 77... Line 83...
77
		"ce_zone_geo",
83
		"ce_zone_geo",
78
		"date_observation",
84
		"date_observation",
79
		"lieudit",
85
		"lieudit",
80
		"station",
86
		"station",
81
		"milieu",
87
		"milieu",
-
 
88
		"mots_cles_texte",
82
		"commentaire",
89
		"commentaire",
83
		"transmission",
90
		"transmission",
84
		"date_creation",
91
		"date_creation",
85
		"date_modification",
92
		"date_modification",
-
 
93
		"date_transmission",
86
		"latitude",
94
		"latitude",
87
		"longitude",
95
		"longitude",
-
 
96
		"abondance",
-
 
97
		"certitude",
88
		"phenologie",
98
		"phenologie",
89
		"code_insee_calcule"
99
		"code_insee_calcule"
90
	);
100
	);
Line -... Line 101...
-
 
101
 
91
 
102
	// cf: initialiser_pdo_ordered_statements()
92
	// eg: "INSERT INTO cel_obs (ce_utilisateur, ..., phenologie, code_insee_calcule) VALUES"
103
	// eg: "INSERT INTO cel_obs (ce_utilisateur, ..., phenologie, code_insee_calcule) VALUES"
93
	// colonnes statiques d'abord, les autres ensuite, dans l'ordre de $ordre_BDD
104
	// colonnes statiques d'abord, les autres ensuite, dans l'ordre de $ordre_BDD
94
	static $insert_prefix_ordre;
-
 
95
 
-
 
96
	// seconde possibilité
-
 
97
	// eg: "INSERT INTO cel_obs (ce_utilisateur, ..., date_creation, ...phenologie, code_insee_calcule) VALUES"
-
 
98
	static $insert_prefix;
-
 
99
 
105
	static $insert_prefix_ordre;
100
	// eg: "(<id>, <prenom>, <nom>, <email>, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
106
	// eg: "(<id>, <prenom>, <nom>, <email>, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
101
	// dont le nombre de placeholder dépend du nombre de colonnes non-statiques
107
	// dont le nombre de placeholder dépend du nombre de colonnes non-statiques
102
	// colonnes statiques d'abord, les autres ensuite, dans l'ordre de $ordre_BDD
108
	// colonnes statiques d'abord, les autres ensuite, dans l'ordre de $ordre_BDD
Line 103... Line 109...
103
	static $insert_ligne_pattern_ordre;
109
	static $insert_ligne_pattern_ordre;
-
 
110
 
-
 
111
	// seconde (meilleure) possibilité
-
 
112
	// cf: initialiser_pdo_statements()
104
 
113
	// eg: "INSERT INTO cel_obs (ce_utilisateur, ..., date_creation, ...phenologie, code_insee_calcule) VALUES"
105
	// seconde possibilité:
114
	static $insert_prefix;
106
	// eg: "(<id>, <prenom>, <nom>, <email>, ?, ?, ?, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
115
	// eg: "(<id>, <prenom>, <nom>, <email>, ?, ?, ?, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
Line 107... Line 116...
107
	// dont le nombre de placeholder dépend du nombre de colonnes non-statiques
116
	// dont le nombre de placeholder dépend du nombre de colonnes non-statiques
108
	static $insert_ligne_pattern;
117
	static $insert_ligne_pattern;
109
 
118
 
110
	/*
119
	/*
111
	  Ces colonnes:
120
	  Ces colonnes:
112
	  - sont propres à l'ensemble des enregistrements uploadés
121
	  - sont propres à l'ensemble des enregistrements uploadés
-
 
122
	  - sont indépendantes du numéro de lignes
-
 
123
	  - n'ont pas de valeur par défaut dans la structure de la table
113
	  - sont indépendantes du numéro de lignes
124
	  - nécessitent une initialisation dans le cadre de l'upload
114
	  - n'ont pas de valeur par défaut dans la structure de la table
125
 
115
	  - nécessitent une initialisation dans le cadre de l'upload
126
	  initialiser_colonnes_statiques() y merge les données d'identification utilisateur
116
	*/
127
	*/
117
	public $colonnes_statiques = Array(
128
	public $colonnes_statiques = Array(
Line 126... Line 137...
126
		"date_creation" => "now()",
137
		"date_creation" => "now()",
127
		"date_modification" => "now()",
138
		"date_modification" => "now()",
128
	);
139
	);
Line 129... Line 140...
129
 
140
 
-
 
141
	public $id_utilisateur = NULL;
130
	public $id_utilisateur = NULL;
142
 
131
	// erreurs d'import
143
	// erreurs d'import
Line -... Line 144...
-
 
144
	public $bilan = Array();
132
	public $bilan = Array();
145
 
133
 
146
 
134
	function ExportXLS($config) {
147
	function ExportXLS($config) {
Line 135... Line 148...
135
		parent::__construct($config);
148
		parent::__construct($config);
136
	}
149
	}
137
 
150
 
138
	function createElement($pairs) {
151
	function createElement($pairs) {
-
 
152
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
139
		if(!isset($pairs['utilisateur']) || trim($pairs['utilisateur']) == '') {
153
			echo '0'; exit;
140
			echo '0'; exit;
154
		}
Line 141... Line 155...
141
		}
155
 
142
		$id_utilisateur = intval($pairs['utilisateur']);
156
		$id_utilisateur = intval($pairs['utilisateur']);
Line 143... Line 157...
143
		$this->id_utilisateur = $id_utilisateur; // pour traiterImage();
157
		$this->id_utilisateur = $id_utilisateur; // pour traiterImage();
-
 
158
 
144
 
159
		if(!isset($_SESSION)) session_start();
Line 145... Line 160...
145
		if(!isset($_SESSION)) session_start();
160
        $this->controleUtilisateur($id_utilisateur);
146
        $this->controleUtilisateur($id_utilisateur);
161
 
147
 
162
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
148
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
-
 
149
		$this->initialiser_colonnes_statiques($id_utilisateur);
163
 
150
 
-
 
151
		// initialisation du statement PDO/MySQL
-
 
152
		self::$insert_prefix_ordre = 'INSERT INTO cel_obs ('.
164
		$this->initialiser_colonnes_statiques($id_utilisateur);
153
			implode(', ', array_keys($this->colonnes_statiques)) .
-
 
154
			', ' .
-
 
155
			implode(', ', array_diff(self::$ordre_BDD, array_keys($this->colonnes_statiques))) .
-
 
156
			') VALUES ';
-
 
157
 
165
 
158
		self::$insert_prefix = 'INSERT INTO cel_obs ('.
-
 
159
			implode(', ', self::$ordre_BDD) . ') VALUES ';
-
 
160
 
-
 
161
		self::$insert_ligne_pattern_ordre =
-
 
Line 162... Line -...
162
			'(' .
-
 
163
			implode(', ', $this->colonnes_statiques) .
-
 
164
			', ' .
-
 
165
			str_repeat('?, ', count(self::$ordre_BDD) - count($this->colonnes_statiques) - 1) .
-
 
166
			'?' .
-
 
167
			')';
-
 
168
 
-
 
169
		self::$insert_ligne_pattern =
-
 
170
			'(' .
-
 
Line 171... Line 166...
171
			implode(', ', array_values(array_map(
166
		// initialisation du statement PDO/MySQL
Line 172... Line 167...
172
				function($item) { return is_null($item) ? '?' : $item; },
167
		// première version, pattern de requête pas génial
173
				array_merge(
168
		/* list(self;;$insert_prefix_ordre, self::$insert_ligne_pattern_ordre) =
Line 266... Line 261...
266
			$this->bdd->beginTransaction();
261
			$this->bdd->beginTransaction();
267
			$stmt = $this->bdd->prepare($sql_pattern);
262
			$stmt = $this->bdd->prepare($sql_pattern);
268
			$donnees = array();
263
			$donnees = array();
269
			foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
264
			foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
Line 270... Line -...
270
 
-
 
271
			echo $sql_pattern;
265
 
272
			var_dump($enregistrements);
-
 
Line 273... Line 266...
273
			var_dump($donnees);die;
266
			/* debug ici: echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;*/
Line 274... Line 267...
274
 
267
 
275
			$stmt->execute($donnees);
268
			$stmt->execute($donnees);
Line 408... Line 401...
408
			$requete = sprintf($images_insert, implode(', ', $images_obs_assoc));
401
			$requete = sprintf($images_insert, implode(', ', $images_obs_assoc));
409
			echo "$requete\n";
402
			echo "$requete\n";
410
		}
403
		}
411
	}
404
	}
Line 412... Line 405...
412
 
405
 
-
 
406
	/*
-
 
407
	  Aucune des valeurs présentes dans $enregistrement n'est quotée
-
 
408
	  cad aucune des valeurs retournée par traiter{Espece|Localisation}()
-
 
409
	  car ce tableau est passé à un PDO::preparedStatement() qui applique
-
 
410
	  proprement les règle d'échappement.
413
 
411
	 */
414
	static function chargerLigne($ligne, $dernier_ordre, $cel) {
412
	static function chargerLigne($ligne, $dernier_ordre, $cel) {
415
		// en premier car le résultat est utile pour
413
		// en premier car le résultat est utile pour
416
		// traiter longitude et latitude (traiterLonLat())
414
		// traiter longitude et latitude (traiterLonLat())
Line 423... Line 421...
423
 
421
 
424
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
422
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
425
		$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
423
		$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
Line -... Line 424...
-
 
424
		self::traiterLocalisation($ligne, $localisation, $cel);
-
 
425
 
-
 
426
		// $transmission est utilisé pour date_transmission
-
 
427
		$transmission = in_array(strtolower(trim($ligne[C_TRANSMISSION])), array(1, 'oui')) ? 1 : 0;
426
		self::traiterLocalisation($ligne, $localisation, $cel);
428
 
427
 
429
 
428
		// Dans ce tableau, seules devraient apparaître les données variable pour chaque ligne.
430
		// Dans ce tableau, seules devraient apparaître les données variable pour chaque ligne.
429
		// Dans ce tableau, l'ordre des clefs n'importe pas (cf: self::sortArrayByArray())
431
		// Dans ce tableau, l'ordre des clefs n'importe pas (cf: self::sortArrayByArray())
Line 430... Line -...
430
		$enregistrement = Array(
-
 
431
			"ordre" => $dernier_ordre,
432
		$enregistrement = Array(
432
 
433
			"ordre" => $dernier_ordre,
433
			// $this->quoteNonNull() est déjà appliquée dans traiterEspece()
434
 
434
			"nom_sel" => $espece[C_NOM_SEL],
435
			"nom_sel" => $espece[C_NOM_SEL],
435
			"nom_sel_nn" => $espece[C_NOM_SEL_NN],
436
			"nom_sel_nn" => $espece[C_NOM_SEL_NN],
436
			"nom_ret" => $espece[C_NOM_RET],
437
			"nom_ret" => $espece[C_NOM_RET],
Line 437... Line 438...
437
			"nom_ret_nn" => $espece[C_NOM_RET_NN],
438
			"nom_ret_nn" => $espece[C_NOM_RET_NN],
Line 438... Line -...
438
			"nt" => $espece[C_NT],
-
 
439
			"famille" => $espece[C_FAMILLE],
439
			"nt" => $espece[C_NT],
440
 
440
			"famille" => $espece[C_FAMILLE],
Line 441... Line 441...
441
			"nom_referentiel" => $cel->quoteNonNull($referentiel),
441
 
442
 
442
			"nom_referentiel" => $referentiel,
Line 443... Line 443...
443
			// $this->quoteNonNull() est déjà appliquée dans traiterLocalisation()
443
 
444
			"zone_geo" => $localisation[C_ZONE_GEO],
444
			"zone_geo" => $localisation[C_ZONE_GEO],
445
			"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
445
			"ce_zone_geo" => $localisation[C_CE_ZONE_GEO],
446
 
-
 
Line -... Line 446...
-
 
446
 
-
 
447
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
Line -... Line 448...
-
 
448
			"date_observation" => self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne),
447
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (date incompréhensible)
449
 
Line 448... Line 450...
448
			"date_observation" => $cel->quoteNonNull(self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne)),
450
			"lieudit" => trim($ligne[C_LIEUDIT]),
449
 
451
			"station" => trim($ligne[C_STATION]),
450
			"lieudit" => $cel->quoteNonNull(trim($ligne[C_LIEUDIT])),
452
			"milieu" => trim($ligne[C_MILIEU]),
Line 451... Line 453...
451
			"station" => $cel->quoteNonNull(trim($ligne[C_STATION])),
453
 
452
			"milieu" => $cel->quoteNonNull(trim($ligne[C_MILIEU])),
454
			"mots_cles_texte" => NULL, // TODO: foreign-key
453
			"commentaire" => NULL, //$cel->quoteNonNull(trim($ligne[C_COMMENTAIRE])), // TODO: foreign-key
455
			"commentaire" => trim($ligne[C_COMMENTAIRE]),
454
 
456
 
Line 455... Line 457...
455
 
457
			"transmission" => $transmission,
456
			"transmission" => in_array(strtolower(trim($ligne[C_TRANSMISSION])), array(1, 'oui')) ? 1 : 0,
458
			"date_transmission" => $transmission ? date("Y-m-d H:i:s") : NULL, // pas de fonction SQL dans un PDO statement, <=> now()
Line 457... Line 459...
457
 
459
 
458
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
460
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
459
			"latitude" => self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne),
461
			"latitude" => self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne),
Line 476... Line 478...
476
	}
478
	}
Line 477... Line 479...
477
 
479
 
478
	static function traiterImage($str, $cel, &$enregistrement) {
480
	static function traiterImage($str, $cel, &$enregistrement) {
479
		$liste_images = array_filter(explode("/", $str));
481
		$liste_images = array_filter(explode("/", $str));
480
		array_walk($liste_images,
482
		array_walk($liste_images,
481
				   function($item, $key, $obj) { $item = $obj->quoteNonNull_real(trim($item)); },
483
				   function($item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); },
482
				   $cel);
484
				   $cel);
483
		$requete = sprintf(
485
		$requete = sprintf(
484
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
486
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
485
			$cel->id_utilisateur,
487
			$cel->id_utilisateur,
Line 588... Line 590...
588
		$resultat_recherche_espece = $taxon_info_webservice->rechercherInfosSurTexteCodeOuNumTax($ligne[C_NOM_SEL]);
590
		$resultat_recherche_espece = $taxon_info_webservice->rechercherInfosSurTexteCodeOuNumTax($ligne[C_NOM_SEL]);
Line 589... Line 591...
589
 
591
 
590
		// on supprime les noms retenus et renvoi tel quel
592
		// on supprime les noms retenus et renvoi tel quel
591
		// on réutilise les define pour les noms d'indexes, tant qu'à faire
593
		// on réutilise les define pour les noms d'indexes, tant qu'à faire
592
		if (empty($resultat_recherche_espece['en_id_nom'])) {
594
		if (empty($resultat_recherche_espece['en_id_nom'])) {
Line 593... Line 595...
593
			$espece[C_NOM_SEL] = $cel->quoteNonNull(trim($ligne[C_NOM_SEL]));
595
			$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
594
 
596
 
595
			// le reste reste à NULL
597
			// le reste reste à NULL
596
			// TODO: si empty(C_NOM_SEL) et !empty(C_NOM_SEL_NN) : recherche info à partir de C_NOM_SEL_NN
598
			// TODO: si empty(C_NOM_SEL) et !empty(C_NOM_SEL_NN) : recherche info à partir de C_NOM_SEL_NN
Line 602... Line 604...
602
 
604
 
603
			return;
605
			return;
Line 604... Line 606...
604
		}
606
		}
605
 
607
 
606
		// succès de la détection, récupération des infos
608
		// succès de la détection, récupération des infos
Line 607... Line 609...
607
		$espece[C_NOM_SEL] = $cel->quoteNonNull($resultat_recherche_espece['nom_sel']);
609
		$espece[C_NOM_SEL] = $resultat_recherche_espece['nom_sel'];
608
		$espece[C_NOM_SEL_NN] = $cel->quoteNonNull($resultat_recherche_espece['en_id_nom']);
610
		$espece[C_NOM_SEL_NN] = $resultat_recherche_espece['en_id_nom'];
609
 
611
 
610
		$complement = $taxon_info_webservice->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
612
		$complement = $taxon_info_webservice->rechercherInformationsComplementairesSurNumNom($resultat_recherche_espece['en_id_nom']);
611
		$espece[C_NOM_RET] = $cel->quoteNonNull($complement['Nom_Retenu']);
613
		$espece[C_NOM_RET] = $complement['Nom_Retenu'];
612
		$espece[C_NOM_RET_NN] = $cel->quoteNonNull($complement['Num_Nom_Retenu']);
614
		$espece[C_NOM_RET_NN] = $complement['Num_Nom_Retenu'];
Line 613... Line 615...
613
		$espece[C_NT] = $cel->quoteNonNull($complement['Num_Taxon']);
615
		$espece[C_NT] = $complement['Num_Taxon'];
614
		$espece[C_FAMILLE] = $cel->quoteNonNull($complement['Famille']);
616
		$espece[C_FAMILLE] = $complement['Famille'];
Line 628... Line 630...
628
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
630
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
629
			// commune + departement : montpellier (34)
631
			// commune + departement : montpellier (34)
630
			$nom_commune=$elements[1];
632
			$nom_commune=$elements[1];
631
			$code_commune=$elements[2];
633
			$code_commune=$elements[2];
632
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
634
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
633
							   $select, $cel->quoteNonNull_real($nom_commune), $cel->quoteNonNull_real($code_commune.'%'));
635
							   $select, $cel->quoteNonNull($nom_commune), $cel->quoteNonNull($code_commune.'%'));
634
		}
636
		}
635
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
637
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
636
			// Code insee seul  
638
			// Code insee seul  
637
			$code_insee_commune=$elements[1];
639
			$code_insee_commune=$elements[1];
638
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull_real($code_insee_commune));
640
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull($code_insee_commune));
639
		}
641
		}
640
		else {
642
		else {
641
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
643
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
642
			// on prend le risque ici de retourner une mauvaise Commune
644
			// on prend le risque ici de retourner une mauvaise Commune
643
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
645
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
644
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull_real($nom_commune.'%'));
646
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull($nom_commune.'%'));
645
		}
647
		}
Line 646... Line 648...
646
	
648
	
647
		$resultat_commune = $cel->requeter($requete);
649
		$resultat_commune = $cel->requeter($requete);
Line 668... Line 670...
668
		// if(strlen($departement) <= 9) return "INSEE-C:0" . $departement; // ? ... TODO
670
		// if(strlen($departement) <= 9) return "INSEE-C:0" . $departement; // ? ... TODO
Line 669... Line 671...
669
 
671
 
Line 670... Line 672...
670
		$departement = trim($departement); // TODO
672
		$departement = trim($departement); // TODO
671
 
673
 
672
	protectloc:
674
	protectloc:
673
		$localisation[C_ZONE_GEO] = $cel->quoteNonNull($localisation[C_ZONE_GEO]);
675
		$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
Line 674... Line 676...
674
		$localisation[C_CE_ZONE_GEO] = $cel->quoteNonNull($localisation[C_CE_ZONE_GEO]);
676
		$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
Line 698... Line 700...
698
			'EST' => 9.7, // Corse
700
			'EST' => 9.7, // Corse
699
			'OUEST' => -5.2); // Ouessan
701
			'OUEST' => -5.2); // Ouessan
700
		return FALSE;
702
		return FALSE;
701
	}
703
	}
Line 702... Line -...
702
 
-
 
-
 
704
 
-
 
705
	// ces valeurs ne sont pas inséré via les placeholders du PDO::preparedStatement
703
 
706
	// et doivent donc être échappées correctement.
704
	public function initialiser_colonnes_statiques() {
707
	public function initialiser_colonnes_statiques() {
705
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
708
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
706
												Array(
709
												Array(
707
													"ce_utilisateur" => $this->id_utilisateur,
710
													"ce_utilisateur" => $this->id_utilisateur,
708
													"prenom_utilisateur" => $this->quoteNonNull_real($this->utilisateur['prenom']),
711
													"prenom_utilisateur" => $this->quoteNonNull($this->utilisateur['prenom']),
709
													"nom_utilisateur" => $this->quoteNonNull_real($this->utilisateur['nom']),
712
													"nom_utilisateur" => $this->quoteNonNull($this->utilisateur['nom']),
710
													"courriel_utilisateur" => $this->quoteNonNull_real($this->utilisateur['courriel']),
713
													"courriel_utilisateur" => $this->quoteNonNull($this->utilisateur['courriel']),
Line 711... Line 714...
711
												));
714
												));
Line 712... Line 715...
712
 
715
 
-
 
716
	}
713
	}
717
 
714
 
718
	static function initialiser_pdo_ordered_statements($colonnes_statiques) {
-
 
719
		return Array(
-
 
720
			// insert_ligne_pattern_ordre
-
 
721
			sprintf('INSERT INTO cel_obs (%s, %s) VALUES',
-
 
722
					implode(', ', array_keys($colonnes_statiques)),
-
 
723
					implode(', ', array_diff(self::$ordre_BDD, array_keys($colonnes_statiques)))),
715
	private function quoteNonNull_real($chaine) {
724
 
-
 
725
			// insert_ligne_pattern_ordre
-
 
726
			sprintf('(%s, %s ?)',
-
 
727
					implode(', ', $colonnes_statiques),
-
 
728
					str_repeat('?, ', count(self::$ordre_BDD) - count($colonnes_statiques) - 1))
-
 
729
		);
-
 
730
	}
-
 
731
 
-
 
732
	static function initialiser_pdo_statements($colonnes_statiques) {
-
 
733
		return Array( 
-
 
734
			// insert_prefix
-
 
735
			sprintf('INSERT INTO cel_obs (%s) VALUES ',
-
 
736
					implode(', ', self::$ordre_BDD)),
-
 
737
 
-
 
738
			// insert_ligne_pattern =
-
 
739
			'(' .
-
 
740
			implode(', ', array_values(array_map(
-
 
741
				function($item) { return is_null($item) ? '?' : $item; },
-
 
742
				array_merge(
-
 
743
					array_map(function() { return NULL; }, array_flip(self::$ordre_BDD)),
-
 
744
					$colonnes_statiques
716
		if(is_null($chaine)) return "NULL";
745
				)))) .
Line 717... Line 746...
717
		if(!is_string($chaine)) die("erreur __FILE__, __LINE__");
746
			')'
718
		return $this->bdd->quote($chaine);
747
		);
719
	}
748
	}
720
 
-
 
721
	// équivalent à CEL->Bdd->proteger() (qui wrap PDO::quote),
749
 
722
	// sans transformer NULL en ""
750
	// équivalent à CEL->Bdd->proteger() (qui wrap PDO::quote),
723
	private function quoteNonNull($chaine) {
751
	// sans transformer NULL en ""
724
		return $chaine;
752
	private function quoteNonNull($chaine) {