Subversion Repositories eFlore/Applications.cel

Rev

Rev 1727 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1727 Rev 1728
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 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 402... Line 402...
402
			//$req .= implode(', ', $enregistrement) . "\n";
402
			//$req .= implode(', ', $enregistrement) . "\n";
403
		}
403
		}
404
	}
404
	}
Line 405... Line 405...
405
 
405
 
406
 
406
 
407
	static function stockerMotsCle($cel, $enregistrements, $tous_mots_cle, $lastid) {
407
	static function stockerMotsCle($enregistrements, $tous_mots_cle, $lastid) {
408
		$c = 0;
408
		$c = 0;
409
		// debug: var_dump($tous_mots_cle);die;
409
		// debug: var_dump($tous_mots_cle);die;
410
		foreach($tous_mots_cle as $v) $c += count($v['mots_cle']['to_insert']);
410
		foreach($tous_mots_cle as $v) $c += count($v['mots_cle']['to_insert']);
Line 411... Line 411...
411
		return $c;
411
		return $c;
412
	}
412
	}
413
 
413
 
Line 414... Line 414...
414
	static function stockerImages($cel, $enregistrements, $toutes_images, $lastid) {
414
	static function stockerImages($enregistrements, $toutes_images, $lastid) {
415
		$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
415
		$images_insert = 'INSERT INTO cel_obs_images (id_image, id_observation) VALUES %s ON DUPLICATE KEY UPDATE id_image = id_image';
Line 428... Line 428...
428
		}
428
		}
Line 429... Line 429...
429
 
429
 
430
		if($images_obs_assoc) {
430
		if($images_obs_assoc) {
431
			$requete = sprintf($images_insert, implode(', ', $images_obs_assoc));
431
			$requete = sprintf($images_insert, implode(', ', $images_obs_assoc));
432
			// debug echo "$requete\n";
432
			// debug echo "$requete\n";
433
			$cel->requeter($requete);
433
			Cel::db()->requeter($requete);
Line 434... Line 434...
434
		}
434
		}
435
 
435
 
Line 452... Line 452...
452
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
452
						C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
453
		self::traiterEspece($ligne, $espece, $cel);
453
		self::traiterEspece($ligne, $espece, $cel);
Line 454... Line 454...
454
 
454
 
455
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
455
		// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
456
		$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
456
		$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
Line 457... Line 457...
457
		self::traiterLocalisation($ligne, $localisation, $cel);
457
		self::traiterLocalisation($ligne, $localisation);
458
 
458
 
459
		// $transmission est utilisé pour date_transmission
459
		// $transmission est utilisé pour date_transmission
Line 506... Line 506...
506
		);
506
		);
Line 507... Line 507...
507
 
507
 
508
		// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
508
		// passage de $enregistrement par référence, ainsi ['_images'] n'est défini
509
		// que si des résultats sont trouvés
509
		// que si des résultats sont trouvés
510
		// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
510
		// "@" car PHPExcel supprime les colonnes null sur toute la feuille (ou tout le chunk)
Line 511... Line 511...
511
		if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel, $enregistrement);
511
		if(@$ligne[C_IMAGES]) self::traiterImage($ligne[C_IMAGES], $cel->id_utilisateur, $enregistrement);
Line 512... Line 512...
512
 
512
 
513
		if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel, $enregistrement);
513
		if(@$ligne[C_MOTS_CLES_TEXTE]) self::traiterMotsCle($ligne[C_MOTS_CLES_TEXTE], $cel->id_utilisateur, $enregistrement);
Line 514... Line 514...
514
 
514
 
515
		return $enregistrement;
515
		return $enregistrement;
Line 516... Line 516...
516
	}
516
	}
517
 
517
 
518
	static function traiterImage($str, $cel, &$enregistrement) {
518
	static function traiterImage($str, $id_utilisateur, &$enregistrement) {
519
		$liste_images = array_filter(explode("/", $str));
519
		$liste_images = array_filter(explode("/", $str));
520
 
520
 
521
		//array_walk($liste_images, '__anonyme_4', $cel);
521
		//array_walk($liste_images, '__anonyme_4');
Line 522... Line 522...
522
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'), $cel);
522
		array_walk($liste_images, array(__CLASS__, '__anonyme_4'));
Line 523... Line 523...
523
		$requete = sprintf(
523
		$requete = sprintf(
524
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
524
			"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")",
Line 525... Line 525...
525
			$cel->id_utilisateur,
525
			$id_utilisateur,
526
			implode('","', $liste_images));
526
			implode('","', $liste_images));
527
 
527
 
Line 528... Line 528...
528
		$resultat = $cel->requeter($requete);
528
		$resultat = Cel::db()->requeter($requete);
529
 
529
 
530
		if($resultat) $enregistrement['_images'] = $resultat;
530
		if($resultat) $enregistrement['_images'] = $resultat;
531
	}
531
	}
532
 
532
 
533
	static function traiterMotsCle($str, $cel, &$enregistrement) {
533
	static function traiterMotsCle($str, $id_utilisateur, &$enregistrement) {
Line 534... Line 534...
534
		$liste_mots_cle = $liste_mots_cle_recherche = array_map("trim", array_unique(array_filter(explode(",", $str))));
534
		$liste_mots_cle = $liste_mots_cle_recherche = array_map("trim", array_unique(array_filter(explode(",", $str))));
535
		array_walk($liste_mots_cle_recherche, array(__CLASS__, '__anonyme_4'), $cel);
535
		array_walk($liste_mots_cle_recherche, array(__CLASS__, '__anonyme_4'));
Line 536... Line 536...
536
 
536
 
537
		// TODO!!!! remplace > (pour les tests uniquement) par un = et supprimer le group by mot_cle
537
		// TODO!!!! remplace > (pour les tests uniquement) par un = et supprimer le group by mot_cle
Line 701... Line 701...
701
		$espece[C_NT] = $complement['Num_Taxon'];
701
		$espece[C_NT] = $complement['Num_Taxon'];
702
		$espece[C_FAMILLE] = $complement['Famille'];
702
		$espece[C_FAMILLE] = $complement['Famille'];
703
		//var_dump("a", $espece);die;
703
		//var_dump("a", $espece);die;
704
	}
704
	}
Line 705... Line 705...
705
 
705
 
706
	static function detectFromNom($nom, $cel) {
706
	static function detectFromNom($nom) {
707
		$r = $cel->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
707
		$r = Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s') ".
708
									"ORDER BY nom_sci ASC LIMIT 0, 1",
708
									"ORDER BY nom_sci ASC LIMIT 0, 1",
709
									$cel->proteger($nom)));
709
									Cel::db()->proteger($nom)));
Line 710... Line 710...
710
		if($r) return $r;
710
		if($r) return $r;
711
 
711
 
712
		$cel->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s' OR nom LIKE '%s') ".
712
		Cel::db()->requeter(sprintf("SELECT num_nom, num_tax_sup FROM bdtfx_v1_01 WHERE (nom_sci LIKE '%s' OR nom LIKE '%s') ".
713
							   "ORDER BY nom_sci ASC LIMIT 0, 1",
713
							   "ORDER BY nom_sci ASC LIMIT 0, 1",
714
							   $cel->proteger($nom),
714
							   Cel::db()->proteger($nom),
715
							   $cel->proteger(str_replace(' ', '% ', $nom))));
715
							   Cel::db()->proteger(str_replace(' ', '% ', $nom))));
Line 716... Line 716...
716
		return $r;
716
		return $r;
717
	}
717
	}
718
 
718
 
719
 
719
 
720
	static function traiterLocalisation($ligne, Array &$localisation, $cel) {
720
	static function traiterLocalisation($ligne, Array &$localisation) {
721
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
721
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
Line 749... Line 749...
749
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
749
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
750
			// commune + departement : montpellier (34)
750
			// commune + departement : montpellier (34)
751
			$nom_commune=$elements[1];
751
			$nom_commune=$elements[1];
752
			$code_commune=$elements[2];
752
			$code_commune=$elements[2];
753
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
753
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
754
							   $select, $cel->quoteNonNull($nom_commune), $cel->quoteNonNull($code_commune.'%'));
754
							   $select, self::quoteNonNull($nom_commune), self::quoteNonNull($code_commune.'%'));
755
		}
755
		}
756
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
756
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
757
			// Code insee seul  
757
			// Code insee seul  
758
			$code_insee_commune=$elements[1];
758
			$code_insee_commune=$elements[1];
759
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull($code_insee_commune));
759
	 	    $requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
760
		}
760
		}
761
		else {
761
		else {
762
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
762
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
763
			// on prend le risque ici de retourner une mauvaise Commune
763
			// on prend le risque ici de retourner une mauvaise Commune
764
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
764
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
765
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull($nom_commune.'%'));
765
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
766
		}
766
		}
Line 767... Line 767...
767
	
767
	
768
		$resultat_commune = $cel->requeter($requete);
768
		$resultat_commune = Cel::db()->requeter($requete);
Line 769... Line 769...
769
		// TODO: levenstein sort ?
769
		// TODO: levenstein sort ?
770
 
770
 
771
		// cas de la commune introuvable dans le référentiel
771
		// cas de la commune introuvable dans le référentiel
Line 800... Line 800...
800
		$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
800
		$localisation[C_ZONE_GEO] = $localisation[C_ZONE_GEO];
801
		$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
801
		$localisation[C_CE_ZONE_GEO] = $localisation[C_CE_ZONE_GEO];
802
	}
802
	}
Line 803... Line 803...
803
 
803
 
804
	/*
804
	/*
805
	static function traiterLocalisation($ligne, Array &$localisation, $cel) {
805
	static function traiterLocalisation($ligne, Array &$localisation) {
806
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
806
	    $identifiant_commune = trim($ligne[C_ZONE_GEO]);
807
		if(!$identifiant_commune) {
807
		if(!$identifiant_commune) {
808
			$departement = trim($ligne[C_CE_ZONE_GEO]);
808
			$departement = trim($ligne[C_CE_ZONE_GEO]);
809
			goto testdepartement;
809
			goto testdepartement;
Line 815... Line 815...
815
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
815
		if (preg_match('/(.*) \((\d+)\)/', $identifiant_commune, $elements)) {
816
			// commune + departement : montpellier (34)
816
			// commune + departement : montpellier (34)
817
			$nom_commune=$elements[1];
817
			$nom_commune=$elements[1];
818
			$code_commune=$elements[2];
818
			$code_commune=$elements[2];
819
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
819
	 	    $requete = sprintf("%s WHERE nom = %s AND code LIKE %s",
820
							   $select, $cel->quoteNonNull($nom_commune), $cel->quoteNonNull($code_commune.'%'));
820
							   $select, self::quoteNonNull($nom_commune), self::quoteNonNull($code_commune.'%'));
821
		}
821
		}
822
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
822
		elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) {
823
			// Code insee seul  
823
			// Code insee seul  
824
			$code_insee_commune=$elements[1];
824
			$code_insee_commune=$elements[1];
825
	 	    $requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull($code_insee_commune));
825
	 	    $requete = sprintf("%s WHERE code = %s", $select, self::quoteNonNull($code_insee_commune));
826
		}
826
		}
827
		else {
827
		else {
828
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
828
			// Commune seule (le departement sera recupere dans la colonne departement si elle est presente)
829
			// on prend le risque ici de retourner une mauvaise Commune
829
			// on prend le risque ici de retourner une mauvaise Commune
830
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
830
			$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune));
831
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull($nom_commune.'%'));
831
	 	    $requete = sprintf("%s WHERE nom LIKE %s", $select, self::quoteNonNull($nom_commune.'%'));
832
		}
832
		}
Line 833... Line 833...
833
	
833
	
834
		$resultat_commune = $cel->requeter($requete);
834
		$resultat_commune = Cel::db()->requeter($requete);
Line 835... Line 835...
835
		// TODO: levenstein sort ?
835
		// TODO: levenstein sort ?
836
 
836
 
837
		// cas de la commune introuvable dans le référentiel
837
		// cas de la commune introuvable dans le référentiel
Line 891... Line 891...
891
	// et doivent donc être échappées correctement.
891
	// et doivent donc être échappées correctement.
892
	public function initialiser_colonnes_statiques() {
892
	public function initialiser_colonnes_statiques() {
893
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
893
		$this->colonnes_statiques = array_merge($this->colonnes_statiques,
894
												Array(
894
												Array(
895
													"ce_utilisateur" => $this->id_utilisateur,
895
													"ce_utilisateur" => $this->id_utilisateur,
896
													"prenom_utilisateur" => $this->quoteNonNull($this->utilisateur['prenom']),
896
													"prenom_utilisateur" => self::quoteNonNull($this->utilisateur['prenom']),
897
													"nom_utilisateur" => $this->quoteNonNull($this->utilisateur['nom']),
897
													"nom_utilisateur" => self::quoteNonNull($this->utilisateur['nom']),
898
													"courriel_utilisateur" => $this->quoteNonNull($this->utilisateur['courriel']),
898
													"courriel_utilisateur" => self::quoteNonNull($this->utilisateur['courriel']),
899
												));
899
												));
Line 900... Line 900...
900
 
900
 
Line 901... Line 901...
901
	}
901
	}
Line 934... Line 934...
934
				)))) .
934
				)))) .
935
			')'
935
			')'
936
		);
936
		);
937
	}
937
	}
Line 938... Line 938...
938
 
938
 
939
	// équivalent à CEL->Bdd->proteger() (qui wrap PDO::quote),
939
	// équivalent à Bdd2->proteger() (qui wrap PDO::quote),
940
	// sans transformer NULL en ""
940
	// sans transformer NULL en ""
941
	private function quoteNonNull($chaine) {
941
	static function quoteNonNull($chaine) {
942
		if(is_null($chaine)) return "NULL";
942
		if(is_null($chaine)) return "NULL";
943
		if(!is_string($chaine)) die("erreur __FILE__, __LINE__");
943
		if(!is_string($chaine)) die("erreur __FILE__, __LINE__");
944
		return Cel::db()->quote($chaine);
944
		return Cel::db()->quote($chaine);