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