Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 1760 Rev 1765
Line 70... Line 70...
70
function __anonyme_3($cell) { return !is_null($cell); };
70
function __anonyme_3($cell) { return !is_null($cell); };
71
function __anonyme_5($item) { return is_null($item) ? '?' : $item; }
71
function __anonyme_5($item) { return is_null($item) ? '?' : $item; }
72
function __anonyme_6() { return NULL; }
72
function __anonyme_6() { return NULL; }
Line 73... Line 73...
73
 
73
 
74
class ImportXLS extends Cel  {
74
class ImportXLS extends Cel  {
Line 75... Line 75...
75
	static function __anonyme_4(&$item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); }
75
	static function __anonyme_4(&$item, $key) { $item = self::quoteNonNull(trim($item)); }
76
 
76
 
77
	static $ordre_BDD = Array(
77
	static $ordre_BDD = Array(
78
		"ce_utilisateur",
78
		"ce_utilisateur",
Line 227... Line 227...
227
		$obs_ajouts = 0;
227
		$obs_ajouts = 0;
228
		$obs_maj = 0;
228
		$obs_maj = 0;
229
		$nb_images_ajoutees = 0;
229
		$nb_images_ajoutees = 0;
230
		$nb_mots_cle_ajoutes = 0;
230
		$nb_mots_cle_ajoutes = 0;
Line 231... Line 231...
231
 
231
 
232
		$dernier_ordre = $this->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
232
		$dernier_ordre = Cel::db()->requeter("SELECT MAX(ordre) AS ordre FROM cel_obs WHERE ce_utilisateur = $id_utilisateur");
233
		$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
233
		$dernier_ordre = intval($dernier_ordre[0]['ordre']) + 1;
Line 234... Line 234...
234
		if(! $dernier_ordre) $dernier_ordre = 0;
234
		if(! $dernier_ordre) $dernier_ordre = 0;
235
 
235
 
Line 268... Line 268...
268
 
268
 
269
			$sql_pattern = self::$insert_prefix .
269
			$sql_pattern = self::$insert_prefix .
270
				str_repeat(self::$insert_ligne_pattern . ', ', $nb_rec - 1) .
270
				str_repeat(self::$insert_ligne_pattern . ', ', $nb_rec - 1) .
Line 271... Line 271...
271
				self::$insert_ligne_pattern;
271
				self::$insert_ligne_pattern;
272
 
272
 
273
			$this->bdd->beginTransaction();
273
			Cel::db()->beginTransaction();
274
			$stmt = $this->bdd->prepare($sql_pattern);
274
			$stmt = Cel::db()->prepare($sql_pattern);
Line 275... Line 275...
275
			$donnees = array();
275
			$donnees = array();
Line 276... Line 276...
276
			foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
276
			foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e));
Line 277... Line 277...
277
 
277
 
278
			/* debug ici: echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;*/
278
			/* debug ici: echo $sql_pattern . "\n"; var_dump($enregistrements, $donnees); die;*/
279
 
279
 
Line 280... Line 280...
280
			$stmt->execute($donnees);
280
			$stmt->execute($donnees);
Line 281... Line 281...
281
 
281
 
282
			// $stmt->debugDumpParams(); // https://bugs.php.net/bug.php?id=52384
282
			// $stmt->debugDumpParams(); // https://bugs.php.net/bug.php?id=52384
283
			$dernier_autoinc = $this->bdd->lastInsertId();
283
			$dernier_autoinc = Cel::db()->lastInsertId();
284
			$this->bdd->commit();
284
			Cel::db()->commit();
285
 
285
 
286
			if(! $dernier_autoinc) trigger_error("l'insertion semble avoir échoué", E_USER_NOTICE);
286
			if(! $dernier_autoinc) trigger_error("l'insertion semble avoir échoué", E_USER_NOTICE);
Line 287... Line 287...
287
 
287
 
Line 288... Line 288...
288
			$obs_ajouts += count($enregistrements);
288
			$obs_ajouts += count($enregistrements);
Line 403... Line 403...
403
			//$req .= implode(', ', $enregistrement) . "\n";
403
			//$req .= implode(', ', $enregistrement) . "\n";
404
		}
404
		}
405
	}
405
	}
Line 406... Line 406...
406
 
406
 
407
 
407
 
408
	static function stockerMotsCle($cel, $enregistrements, $tous_mots_cle, $lastid) {
408
	static function stockerMotsCle($enregistrements, $tous_mots_cle, $lastid) {
409
		$c = 0;
409
		$c = 0;
410
		// debug: var_dump($tous_mots_cle);die;
410
		// debug: var_dump($tous_mots_cle);die;
411
		foreach($tous_mots_cle as $v) $c += count($v['mots_cle']['to_insert']);
411
		foreach($tous_mots_cle as $v) $c += count($v['mots_cle']['to_insert']);
Line 412... Line 412...
412
		return $c;
412
		return $c;
413
	}
413
	}
414
 
414
 
Line 415... Line 415...
415
	static function stockerImages($cel, $enregistrements, $toutes_images, $lastid) {
415
	static function stockerImages($enregistrements, $toutes_images, $lastid) {
416
		$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
416
		$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
Line 429... Line 429...
429
		}
429
		}
Line 430... Line 430...
430
 
430
 
431
		if($images_obs_assoc) {
431
		if($images_obs_assoc) {
432
			$requete = sprintf($images_insert, implode(', ', $images_obs_assoc));
432
			$requete = sprintf($images_insert, implode(', ', $images_obs_assoc));
433
			// debug echo "$requete\n";
433
			// debug echo "$requete\n";
434
			$cel->requeter($requete);
434
			Cel::db()->requeter($requete);
Line 435... Line 435...
435
		}
435
		}
436
 
436
 
Line 454... Line 454...
454
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
454
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
455
		self::traiterEspece($ligne, $espece, $referentiel, $cel);
455
		self::traiterEspece($ligne, $espece, $referentiel, $cel);
Line 456... Line 456...
456
 
456
 
457
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
457
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
458
		$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
458
		$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
Line 459... Line 459...
459
		self::traiterLocalisation($ligne, $localisation, $cel);
459
		self::traiterLocalisation($ligne, $localisation);
460
 
460
 
461
		// $transmission est utilisé pour date_transmission
461
		// $transmission est utilisé pour date_transmission
Line 508... Line 508...
508
		);
508
		);
Line 509... Line 509...
509
 
509
 
510
		// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
510
		// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
511
		// que si des résultats sont trouvés
511
		// que si des résultats sont trouvés
512
		// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
512
		// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
Line 513... Line 513...
513
		if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel, $enregistrement);
513
		if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
Line 514... Line 514...
514
 
514
 
515
		if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel, $enregistrement);
515
		if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
Line 516... Line 516...
516
 
516
 
517
		return $enregistrement;
517
		return $enregistrement;
Line 518... Line 518...
518
	}
518
	}
519
 
519
 
520
	static function traiterImage($str, $cel, &$enregistrement) {
520
	static function traiterImage($str, $id_utilisateur, &$enregistrement) {
521
		$liste_images = array_filter(explode("/", $str));
521
		$liste_images = array_filter(explode("/", $str));
522
 
522
 
523
		//array_walk($liste_images, '__anonyme_4', $cel);
523
		//array_walk($liste_images, '__anonyme_4');
Line 524... Line 524...
524
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'), $cel);
524
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'));
Line 525... Line 525...
525
		$requete = sprintf(
525
		$requete = sprintf(
526
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (%s)",
526
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (%s)",
Line 527... Line 527...
527
			$cel->id_utilisateur,
527
			$id_utilisateur,
528
			implode(',', $liste_images));
528
			implode(',', $liste_images));
529
 
529
 
Line 530... Line 530...
530
		$resultat = $cel->requeter($requete);
530
		$resultat = Cel::db()->requeter($requete);
531
 
531
 
532
		if($resultat) $enregistrement['_images'] = $resultat;
532
		if($resultat) $enregistrement['_images'] = $resultat;
533
	}
533
	}
534
 
534
 
535
	static function traiterMotsCle($str, $cel, &$enregistrement) {
535
	static function traiterMotsCle($str, $id_utilisateur, &$enregistrement) {
Line 536... Line 536...
536
		$liste_mots_cle = $liste_mots_cle_recherche = array_map("trim", array_unique(array_filter(explode(",", $str))));
536
		$liste_mots_cle = $liste_mots_cle_recherche = array_map("trim", array_unique(array_filter(explode(",", $str))));
537
		array_walk($liste_mots_cle_recherche, array(__CLASS__, '__anonyme_4'), $cel);
537
		array_walk($liste_mots_cle_recherche, array(__CLASS__, '__anonyme_4'));
Line 538... Line 538...
538
 
538
 
539
		// TODO!!!! remplace > (pour les tests uniquement) par un = et supprimer le group by mot_cle
539
		// TODO!!!! remplace > (pour les tests uniquement) par un = et supprimer le group by mot_cle
Line 713... Line 713...
713
		$espece[C_NT] = $complement['Num_Taxon'];
713
		$espece[C_NT] = $complement['Num_Taxon'];
714
		$espece[C_FAMILLE] = $complement['Famille'];
714
		$espece[C_FAMILLE] = $complement['Famille'];
715
		//var_dump("a", $espece);die;
715
		//var_dump("a", $espece);die;
716
	}
716
	}
Line 717... Line 717...
717
 
717
 
718
	static function detectFromNom($nom, $cel) {
718
	static function detectFromNom($nom) {
719
		$r = $cel->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
719
		$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
720
									"ORDER BY nom_sci ASC LIMIT 0, 1",
720
									"ORDER BY nom_sci ASC LIMIT 0, 1",
721
									$cel->proteger($nom)));
721
									Cel::db()->proteger($nom)));
Line 722... Line 722...
722
		if($r) return $r;
722
		if($r) return $r;
723
 
723
 
724
		$cel->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s' OR nom LIKE '%s') ".
724
		Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s' OR nom LIKE '%s') ".
725
							   "ORDER BY nom_sci ASC LIMIT 0, 1",
725
							   "ORDER BY nom_sci ASC LIMIT 0, 1",
726
							   $cel->proteger($nom),
726
							   Cel::db()->proteger($nom),
727
							   $cel->proteger(str_replace(' ', '% ', $nom))));
727
							   Cel::db()->proteger(str_replace(' ', '% ', $nom))));
Line 728... Line 728...
728
		return $r;
728
		return $r;
729
	}
729
	}
730
 
730
 
731
 
731
 
732
	static function traiterLocalisation($ligne, Array &$localisation, $cel) {
732
	static function traiterLocalisation($ligne, Array &$localisation) {
733
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
733
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
Line 761... Line 761...
761
		if (preg_match('/(.+) \((\d+)\)/', $identifiant_commune, $elements)) {
761
		if (preg_match('/(.+) \((\d+)\)/', $identifiant_commune, $elements)) {
762
			// commune + departement : montpellier (34)
762
			// commune + departement : montpellier (34)
763
			$nom_commune=$elements[1];
763
			$nom_commune=$elements[1];
764
			$code_commune=$elements[2];
764
			$code_commune=$elements[2];
765
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
765
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
766
							   $select, $cel->quoteNonNull($nom_commune), $cel->quoteNonNull($code_commune.'%'));
766
							   $select, self::quoteNonNull($nom_commune), self::quoteNonNull($code_commune.'%'));
767
		}
767
		}
768
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
768
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
769
			// Code insee seul  
769
			// Code insee seul  
770
			$code_insee_commune=$elements[1];
770
			$code_insee_commune=$elements[1];
771
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull($code_insee_commune));
771
	 	    $requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
772
		}
772
		}
773
		else {
773
		else {
774
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
774
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
775
			// on prend le risque ici de retourner une mauvaise Commune
775
			// on prend le risque ici de retourner une mauvaise Commune
776
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
776
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
777
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull($nom_commune.'%'));
777
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
778
		}
778
		}
Line 779... Line 779...
779
	
779
	
780
		$resultat_commune = $cel->requeter($requete);
780
		$resultat_commune = Cel::db()->requeter($requete);
Line 781... Line 781...
781
		// TODO: levenstein sort ?
781
		// TODO: levenstein sort ?
782
 
782
 
783
		// cas de la commune introuvable dans le référentiel
783
		// cas de la commune introuvable dans le référentiel
Line 812... Line 812...
812
		$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
812
		$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
813
		$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
813
		$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
814
	}
814
	}
Line 815... Line 815...
815
 
815
 
816
	/*
816
	/*
817
	static function traiterLocalisation($ligne, Array &$localisation, $cel) {
817
	static function traiterLocalisation($ligne, Array &$localisation) {
818
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
818
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
819
		if(!$identifiant_commune) {
819
		if(!$identifiant_commune) {
820
			$departement = trim($ligne[C_CE_ZONE_GEO]);
820
			$departement = trim($ligne[C_CE_ZONE_GEO]);
821
			goto testdepartement;
821
			goto testdepartement;
Line 827... Line 827...
827
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
827
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
828
			// commune + departement : montpellier (34)
828
			// commune + departement : montpellier (34)
829
			$nom_commune=$elements[1];
829
			$nom_commune=$elements[1];
830
			$code_commune=$elements[2];
830
			$code_commune=$elements[2];
831
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
831
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
832
							   $select, $cel->quoteNonNull($nom_commune), $cel->quoteNonNull($code_commune.'%'));
832
							   $select, self::quoteNonNull($nom_commune), self::quoteNonNull($code_commune.'%'));
833
		}
833
		}
834
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
834
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
835
			// Code insee seul  
835
			// Code insee seul  
836
			$code_insee_commune=$elements[1];
836
			$code_insee_commune=$elements[1];
837
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull($code_insee_commune));
837
	 	    $requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
838
		}
838
		}
839
		else {
839
		else {
840
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
840
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
841
			// on prend le risque ici de retourner une mauvaise Commune
841
			// on prend le risque ici de retourner une mauvaise Commune
842
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
842
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
843
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull($nom_commune.'%'));
843
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
844
		}
844
		}
Line 845... Line 845...
845
	
845
	
846
		$resultat_commune = $cel->requeter($requete);
846
		$resultat_commune = Cel::db()->requeter($requete);
Line 847... Line 847...
847
		// TODO: levenstein sort ?
847
		// TODO: levenstein sort ?
848
 
848
 
849
		// cas de la commune introuvable dans le référentiel
849
		// cas de la commune introuvable dans le référentiel
Line 904... Line 904...
904
	// et doivent donc être échappées correctement.
904
	// et doivent donc être échappées correctement.
905
	public function initialiser_colonnes_statiques() {
905
	public function initialiser_colonnes_statiques() {
906
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
906
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
907
												Array(
907
												Array(
908
													"ce_utilisateur" => $this->id_utilisateur,
908
													"ce_utilisateur" => $this->id_utilisateur,
909
													"prenom_utilisateur" => $this->quoteNonNull($this->utilisateur['prenom']),
909
													"prenom_utilisateur" => self::quoteNonNull($this->utilisateur['prenom']),
910
													"nom_utilisateur" => $this->quoteNonNull($this->utilisateur['nom']),
910
													"nom_utilisateur" => self::quoteNonNull($this->utilisateur['nom']),
911
													"courriel_utilisateur" => $this->quoteNonNull($this->utilisateur['courriel']),
911
													"courriel_utilisateur" => self::quoteNonNull($this->utilisateur['courriel']),
912
												));
912
												));
Line 913... Line 913...
913
 
913
 
Line 914... Line 914...
914
	}
914
	}
Line 947... Line 947...
947
				)))) .
947
				)))) .
948
			')'
948
			')'
949
		);
949
		);
950
	}
950
	}
Line 951... Line 951...
951
 
951
 
952
	// équivalent à CEL->Bdd->proteger() (qui wrap PDO::quote),
952
	// équivalent à Bdd2->proteger() (qui wrap PDO::quote),
953
	// sans transformer NULL en ""
953
	// sans transformer NULL en ""
954
	private function quoteNonNull($chaine) {
954
	static function quoteNonNull($chaine) {
955
		if(is_null($chaine)) return "NULL";
955
		if(is_null($chaine)) return "NULL";
956
		if(!is_string($chaine)) die("erreur __FILE__, __LINE__");
956
		if(!is_string($chaine)) die("erreur __FILE__, __LINE__");
957
		return $this->bdd->quote($chaine);
957
		return Cel::db()->quote($chaine);
Line 958... Line 958...
958
	}
958
	}
959
 
959
 
960
	public function erreurs_stock($errno, $errstr) {
960
	public function erreurs_stock($errno, $errstr) {