Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1646 Rev 1648
Line 27... Line 27...
27
 
27
 
Line 28... Line 28...
28
date_default_timezone_set("Europe/Paris");
28
date_default_timezone_set("Europe/Paris");
29
 
29
 
30
// nombre d'INSERT à cumuler par requête SQL
30
// nombre d'INSERT à cumuler par requête SQL
-
 
31
// (= nombre de lignes XLS à bufferiser)
Line 31... Line 32...
31
// (= nombre de lignes XLS à bufferiser)
32
//define('NB_LIRE_LIGNE_SIMUL', 30);
32
define('NB_LIRE_LIGNE_SIMUL', 30);
33
define('NB_LIRE_LIGNE_SIMUL', 5);
33
 
34
 
Line 81... Line 82...
81
		"commentaire",
82
		"commentaire",
82
		"transmission",
83
		"transmission",
83
		"date_creation",
84
		"date_creation",
84
		"date_modification",
85
		"date_modification",
85
		"latitude",
86
		"latitude",
86
		"longitude");
87
		"longitude",
-
 
88
		"phenologie",
-
 
89
		"code_insee_calcule"
-
 
90
	);
-
 
91
 
-
 
92
	// 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
-
 
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
 
-
 
100
	// eg: "(<id>, <prenom>, <nom>, <email>, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
-
 
101
	// 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
-
 
103
	static $insert_ligne_pattern_ordre;
-
 
104
 
-
 
105
	// seconde possibilité:
-
 
106
	// eg: "(<id>, <prenom>, <nom>, <email>, ?, ?, ?, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
-
 
107
	// dont le nombre de placeholder dépend du nombre de colonnes non-statiques
-
 
108
	static $insert_ligne_pattern;
Line 87... Line 109...
87
 
109
 
88
	/*
110
	/*
89
	  Ces colonnes:
111
	  Ces colonnes:
90
	  - sont propres à l'ensemble des enregistrements uploadés
112
	  - sont propres à l'ensemble des enregistrements uploadés
Line 124... Line 146...
124
        $this->controleUtilisateur($id_utilisateur);
146
        $this->controleUtilisateur($id_utilisateur);
Line 125... Line 147...
125
 
147
 
126
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
148
        $this->utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur);
Line -... Line 149...
-
 
149
		$this->initialiser_colonnes_statiques($id_utilisateur);
-
 
150
 
-
 
151
		// initialisation du statement PDO/MySQL
-
 
152
		self::$insert_prefix_ordre = 'INSERT INTO cel_obs ('.
-
 
153
			implode(', ', array_keys($this->colonnes_statiques)) .
-
 
154
			', ' .
-
 
155
			implode(', ', array_diff(self::$ordre_BDD, array_keys($this->colonnes_statiques))) .
-
 
156
			') VALUES ';
-
 
157
 
-
 
158
		self::$insert_prefix = 'INSERT INTO cel_obs ('.
-
 
159
			implode(', ', self::$ordre_BDD) . ') VALUES ';
-
 
160
 
-
 
161
		self::$insert_ligne_pattern_ordre =
-
 
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
			'(' .
-
 
171
			implode(', ', array_values(array_map(
-
 
172
				function($item) { return is_null($item) ? '?' : $item; },
-
 
173
				array_merge(
-
 
174
					array_map(function() { return NULL; }, array_flip(self::$ordre_BDD)),
-
 
175
					$this->colonnes_statiques
Line 127... Line 176...
127
		$this->initialiser_colonnes_statiques($id_utilisateur);
176
				)))) .
Line 128... Line 177...
128
 
177
			')';
129
 
178
 
Line 198... Line 247...
198
			// notamment dans RechercheInfosTaxonBeta.php
247
			// notamment dans RechercheInfosTaxonBeta.php
199
			list($enregistrements, $images) =
248
			list($enregistrements, $images) =
200
				self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
249
				self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre);
201
			if(! $enregistrements) break;
250
			if(! $enregistrements) break;
Line -... Line 251...
-
 
251
 
-
 
252
			echo "===chunk\n";
-
 
253
			self::trierColonnes($enregistrements);
-
 
254
			// normalement: NB_LIRE_LIGNE_SIMUL, sauf si une enregistrement ne semble pas valide
-
 
255
			// ou bien lors du dernier chunk
-
 
256
 
-
 
257
			$nb_rec = count($enregistrements);
-
 
258
			$sql_pattern = self::$insert_prefix .
-
 
259
				str_repeat(self::$insert_ligne_pattern_ordre . ', ', $nb_rec - 1) .
-
 
260
				self::$insert_ligne_pattern_ordre;
-
 
261
 
-
 
262
			$sql_pattern = self::$insert_prefix .
-
 
263
				str_repeat(self::$insert_ligne_pattern . ', ', $nb_rec - 1) .
-
 
264
				self::$insert_ligne_pattern;
-
 
265
 
-
 
266
			$this->bdd->beginTransaction();
-
 
267
			$stmt = $this->bdd->prepare($sql_pattern);
-
 
268
			$donnees = array();
-
 
269
			foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
-
 
270
 
-
 
271
			echo $sql_pattern;
-
 
272
			var_dump($enregistrements);
-
 
273
			var_dump($donnees);die;
-
 
274
 
-
 
275
			$stmt->execute($donnees);
-
 
276
 
-
 
277
			// $stmt->debugDumpParams(); // https://bugs.php.net/bug.php?id=52384
202
 
278
			//$this->bdd->commit();
-
 
279
			$dernier_autoinc = $this->bdd->lastInsertId();
-
 
280
			var_dump($dernier_autoinc);
-
 
281
			die;
-
 
282
 
-
 
283
 
203
			$dernier_autoinc = self::stockerEnregistrements($this, $enregistrements);
284
 
-
 
285
			$obs_ajouts += count($enregistrements);
204
			$obs_ajouts += count($enregistrements);
286
			// $obs_ajouts += count($enregistrements['insert']);
205
			// $obs_maj += count($enregistrements_a_MAJ);
287
			// $obs_maj += count($enregistrements['update']);
206
			self::stockerImages($this, $enregistrements, $images, $dernier_autoinc);
288
			self::stockerImages($this, $enregistrements, $images, $dernier_autoinc);
Line 207... Line 289...
207
		}
289
		}
Line 220... Line 302...
220
			$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
302
			$entete_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($v)));
221
			foreach($cols as $col) {
303
			foreach($cols as $col) {
222
				$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
304
				$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom'])));
223
				$entete_officiel_abbrev = $col['abbrev'];
305
				$entete_officiel_abbrev = $col['abbrev'];
224
				if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
306
				if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) {
225
					//debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
307
					// debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n";
226
					define("C_" . strtoupper($entete_officiel_abbrev), $k);
308
					define("C_" . strtoupper($entete_officiel_abbrev), $k);
227
					$colonnes_reconnues[$k] = 1;
309
					$colonnes_reconnues[$k] = 1;
228
					break;
310
					break;
229
				}
311
				}
230
			}
312
			}
Line 266... Line 348...
266
			//if(!$ligne) continue;
348
			//if(!$ligne) continue;
267
			// on a besoin des NULL pour éviter des notice d'index indéfini
349
			// on a besoin des NULL pour éviter des notice d'index indéfini
268
			if(! array_filter($ligne, function($cell) { return !is_null($cell); })) continue;
350
			if(! array_filter($ligne, function($cell) { return !is_null($cell); })) continue;
Line 269... Line 351...
269
 
351
 
270
			if( ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) ) {
352
			if( ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) ) {
-
 
353
				// $enregistrements[] = array_merge($colonnes_statiques, $enregistrement);
Line 271... Line 354...
271
				$enregistrements[] = array_merge($colonnes_statiques, $enregistrement);
354
				$enregistrements[] = $enregistrement;
272
 
355
 
273
				if(isset($enregistrement['_images'])) {
356
				if(isset($enregistrement['_images'])) {
274
					$pos = count($enregistrements) - 1;
357
					$pos = count($enregistrements) - 1;
Line 289... Line 372...
289
		// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
372
		// XXX future: return Array($enregistrements_a_inserer, $enregistrements_a_MAJ, $toutes_images);
290
		return Array($enregistrements, $toutes_images);
373
		return Array($enregistrements, $toutes_images);
291
	}
374
	}
Line 292... Line 375...
292
 
375
 
293
 
-
 
294
	static function stockerEnregistrements($cel, $enregistrements) {
-
 
295
		$req = '';
376
 
296
 
377
	static function trierColonnes(&$enregistrements) {
297
		foreach($enregistrements as $enregistrement) {
-
 
298
			$enregistrement = self::sortArrayByArray($enregistrement, self::$ordre_BDD);
378
		foreach($enregistrements as &$enregistrement) {
299
			array_walk($enregistrement,
-
 
300
					   function(&$item, $k, $obj) { $item = is_null($item) ? "NULL" : $item; },
379
			$enregistrement = self::sortArrayByArray($enregistrement, self::$ordre_BDD);
301
					   $cel);
380
			//array_walk($enregistrement, function(&$item, $k) { $item = is_null($item) ? "NULL" : $item; });
302
			$req .= implode(', ', $enregistrement) . "\n";
-
 
303
		}
-
 
304
		echo "$req\n";
-
 
305
		// TODO: insert
-
 
306
 
-
 
307
		// $cel->executer($req);
-
 
308
		// transactionnel + auto-inc
381
			//$req .= implode(', ', $enregistrement) . "\n";
Line 309... Line 382...
309
		return $cel->bdd->lastInsertId();
382
		}
310
	}
383
	}
Line 375... Line 448...
375
			"date_observation" => $cel->quoteNonNull(self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne)),
448
			"date_observation" => $cel->quoteNonNull(self::traiterDateObs($ligne[C_DATE_OBSERVATION], $ligne)),
Line 376... Line 449...
376
 
449
 
377
			"lieudit" => $cel->quoteNonNull(trim($ligne[C_LIEUDIT])),
450
			"lieudit" => $cel->quoteNonNull(trim($ligne[C_LIEUDIT])),
378
			"station" => $cel->quoteNonNull(trim($ligne[C_STATION])),
451
			"station" => $cel->quoteNonNull(trim($ligne[C_STATION])),
379
			"milieu" => $cel->quoteNonNull(trim($ligne[C_MILIEU])),
452
			"milieu" => $cel->quoteNonNull(trim($ligne[C_MILIEU])),
Line 380... Line 453...
380
			"commentaire" => $cel->quoteNonNull(trim($ligne[C_COMMENTAIRE])), // TODO: foreign-key
453
			"commentaire" => NULL, //$cel->quoteNonNull(trim($ligne[C_COMMENTAIRE])), // TODO: foreign-key
Line 381... Line 454...
381
 
454
 
382
 
455
 
383
			"transmission" => in_array(strtolower(trim($ligne[C_TRANSMISSION])), array(1, 'oui')) ? 1 : 0,
456
			"transmission" => in_array(strtolower(trim($ligne[C_TRANSMISSION])), array(1, 'oui')) ? 1 : 0,
-
 
457
 
-
 
458
			// $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),
-
 
460
			"longitude" => self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne),
-
 
461
 
-
 
462
			// @ car potentiellement optionnelles ou toutes vides => pas d'index dans PHPExcel (tableau optimisé)
-
 
463
			"abondance" => @$ligne[C_ABONDANCE],
384
 
464
			"certitude" => @$ligne[C_CERTITUDE],
Line 385... Line 465...
385
			// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible)
465
			"phenologie" => @$ligne[C_PHENOLOGIE],
386
			"latitude" => self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne),
466
 
387
			"longitude" => self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne),
467
			"code_insee_calcule" => $localisation[C_CE_ZONE_GEO] // TODO ?
Line 396... Line 476...
396
	}
476
	}
Line 397... Line 477...
397
 
477
 
398
	static function traiterImage($str, $cel, &$enregistrement) {
478
	static function traiterImage($str, $cel, &$enregistrement) {
399
		$liste_images = array_filter(explode("/", $str));
479
		$liste_images = array_filter(explode("/", $str));
400
		array_walk($liste_images,
480
		array_walk($liste_images,
401
				   function($item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); },
481
				   function($item, $key, $obj) { $item = $obj->quoteNonNull_real(trim($item)); },
402
				   $cel);
482
				   $cel);
403
		$requete = sprintf(
483
		$requete = sprintf(
404
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
484
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
405
			$cel->id_utilisateur,
485
			$cel->id_utilisateur,
Line 548... Line 628...
548
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
628
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
549
			// commune + departement : montpellier (34)
629
			// commune + departement : montpellier (34)
550
			$nom_commune=$elements[1];
630
			$nom_commune=$elements[1];
551
			$code_commune=$elements[2];
631
			$code_commune=$elements[2];
552
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
632
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
553
							   $select, $cel->quoteNonNull($nom_commune), $cel->quoteNonNull($code_commune.'%'));
633
							   $select, $cel->quoteNonNull_real($nom_commune), $cel->quoteNonNull_real($code_commune.'%'));
554
		}
634
		}
555
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
635
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
556
			// Code insee seul  
636
			// Code insee seul  
557
			$code_insee_commune=$elements[1];
637
			$code_insee_commune=$elements[1];
558
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull($code_insee_commune));
638
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull_real($code_insee_commune));
559
		}
639
		}
560
		else {
640
		else {
561
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
641
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
562
			// on prend le risque ici de retourner une mauvaise Commune
642
			// on prend le risque ici de retourner une mauvaise Commune
563
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
643
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
564
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull($nom_commune.'%'));
644
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull_real($nom_commune.'%'));
565
		}
645
		}
Line 566... Line 646...
566
	
646
	
567
		$resultat_commune = $cel->requeter($requete);
647
		$resultat_commune = $cel->requeter($requete);
Line 623... Line 703...
623
 
703
 
624
	public function initialiser_colonnes_statiques() {
704
	public function initialiser_colonnes_statiques() {
625
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
705
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
626
												Array(
706
												Array(
627
													"ce_utilisateur" => $this->id_utilisateur,
707
													"ce_utilisateur" => $this->id_utilisateur,
628
													"prenom_utilisateur" => $this->quoteNonNull($this->utilisateur['prenom']),
708
													"prenom_utilisateur" => $this->quoteNonNull_real($this->utilisateur['prenom']),
629
													"nom_utilisateur" => $this->quoteNonNull($this->utilisateur['nom']),
709
													"nom_utilisateur" => $this->quoteNonNull_real($this->utilisateur['nom']),
630
													"courriel_utilisateur" => $this->quoteNonNull($this->utilisateur['courriel']),
710
													"courriel_utilisateur" => $this->quoteNonNull_real($this->utilisateur['courriel']),
Line 631... Line 711...
631
												));
711
												));
Line -... Line 712...
-
 
712
 
-
 
713
	}
-
 
714
 
-
 
715
	private function quoteNonNull_real($chaine) {
-
 
716
		if(is_null($chaine)) return "NULL";
-
 
717
		if(!is_string($chaine)) die("erreur __FILE__, __LINE__");
632
 
718
		return $this->bdd->quote($chaine);
633
	}
719
	}
634
 
720
 
-
 
721
	// équivalent à CEL->Bdd->proteger() (qui wrap PDO::quote),
635
	// équivalent à CEL->Bdd->proteger() (qui wrap PDO::quote),
722
	// sans transformer NULL en ""
636
	// sans transformer NULL en ""
723
	private function quoteNonNull($chaine) {
637
	private function quoteNonNull($chaine) {
724
		return $chaine;
638
		if(is_null($chaine)) return "NULL";
725
		if(is_null($chaine)) return "NULL";