| 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";
|