29,7 → 29,8 |
|
// nombre d'INSERT à cumuler par requête SQL |
// (= nombre de lignes XLS à bufferiser) |
define('NB_LIRE_LIGNE_SIMUL', 30); |
//define('NB_LIRE_LIGNE_SIMUL', 30); |
define('NB_LIRE_LIGNE_SIMUL', 5); |
|
// Numbers of days between January 1, 1900 and 1970 (including 19 leap years) |
// see traiterDateObs() |
83,8 → 84,29 |
"date_creation", |
"date_modification", |
"latitude", |
"longitude"); |
"longitude", |
"phenologie", |
"code_insee_calcule" |
); |
|
// eg: "INSERT INTO cel_obs (ce_utilisateur, ..., phenologie, code_insee_calcule) VALUES" |
// colonnes statiques d'abord, les autres ensuite, dans l'ordre de $ordre_BDD |
static $insert_prefix_ordre; |
|
// seconde possibilité |
// eg: "INSERT INTO cel_obs (ce_utilisateur, ..., date_creation, ...phenologie, code_insee_calcule) VALUES" |
static $insert_prefix; |
|
// eg: "(<id>, <prenom>, <nom>, <email>, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" |
// dont le nombre de placeholder dépend du nombre de colonnes non-statiques |
// colonnes statiques d'abord, les autres ensuite, dans l'ordre de $ordre_BDD |
static $insert_ligne_pattern_ordre; |
|
// seconde possibilité: |
// eg: "(<id>, <prenom>, <nom>, <email>, ?, ?, ?, now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" |
// dont le nombre de placeholder dépend du nombre de colonnes non-statiques |
static $insert_ligne_pattern; |
|
/* |
Ces colonnes: |
- sont propres à l'ensemble des enregistrements uploadés |
126,7 → 148,34 |
$this->utilisateur = $this->getInfosComplementairesUtilisateur($id_utilisateur); |
$this->initialiser_colonnes_statiques($id_utilisateur); |
|
// initialisation du statement PDO/MySQL |
self::$insert_prefix_ordre = 'INSERT INTO cel_obs ('. |
implode(', ', array_keys($this->colonnes_statiques)) . |
', ' . |
implode(', ', array_diff(self::$ordre_BDD, array_keys($this->colonnes_statiques))) . |
') VALUES '; |
|
self::$insert_prefix = 'INSERT INTO cel_obs ('. |
implode(', ', self::$ordre_BDD) . ') VALUES '; |
|
self::$insert_ligne_pattern_ordre = |
'(' . |
implode(', ', $this->colonnes_statiques) . |
', ' . |
str_repeat('?, ', count(self::$ordre_BDD) - count($this->colonnes_statiques) - 1) . |
'?' . |
')'; |
|
self::$insert_ligne_pattern = |
'(' . |
implode(', ', array_values(array_map( |
function($item) { return is_null($item) ? '?' : $item; }, |
array_merge( |
array_map(function() { return NULL; }, array_flip(self::$ordre_BDD)), |
$this->colonnes_statiques |
)))) . |
')'; |
|
$infos_fichier = array_pop($_FILES); |
|
/*$objPHPExcel = PHPExcel_IOFactory::load($infos_fichier['tmp_name']); |
200,9 → 249,42 |
self::chargerLignes($this, $donnees, $this->colonnes_statiques, $dernier_ordre); |
if(! $enregistrements) break; |
|
$dernier_autoinc = self::stockerEnregistrements($this, $enregistrements); |
echo "===chunk\n"; |
self::trierColonnes($enregistrements); |
// normalement: NB_LIRE_LIGNE_SIMUL, sauf si une enregistrement ne semble pas valide |
// ou bien lors du dernier chunk |
|
$nb_rec = count($enregistrements); |
$sql_pattern = self::$insert_prefix . |
str_repeat(self::$insert_ligne_pattern_ordre . ', ', $nb_rec - 1) . |
self::$insert_ligne_pattern_ordre; |
|
$sql_pattern = self::$insert_prefix . |
str_repeat(self::$insert_ligne_pattern . ', ', $nb_rec - 1) . |
self::$insert_ligne_pattern; |
|
$this->bdd->beginTransaction(); |
$stmt = $this->bdd->prepare($sql_pattern); |
$donnees = array(); |
foreach($enregistrements as $e) $donnees = array_merge($donnees, array_values($e)); |
|
echo $sql_pattern; |
var_dump($enregistrements); |
var_dump($donnees);die; |
|
$stmt->execute($donnees); |
|
// $stmt->debugDumpParams(); // https://bugs.php.net/bug.php?id=52384 |
//$this->bdd->commit(); |
$dernier_autoinc = $this->bdd->lastInsertId(); |
var_dump($dernier_autoinc); |
die; |
|
|
|
$obs_ajouts += count($enregistrements); |
// $obs_maj += count($enregistrements_a_MAJ); |
// $obs_ajouts += count($enregistrements['insert']); |
// $obs_maj += count($enregistrements['update']); |
self::stockerImages($this, $enregistrements, $images, $dernier_autoinc); |
} |
|
222,7 → 304,7 |
$entete_officiel_simple = iconv('UTF-8', 'ASCII//TRANSLIT', strtolower(trim($col['nom']))); |
$entete_officiel_abbrev = $col['abbrev']; |
if($entete_simple == $entete_officiel_simple || $entete_simple == $entete_officiel_abbrev) { |
//debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n"; |
// debug echo "define C_" . strtoupper($entete_officiel_abbrev) . ", $k ($v)\n"; |
define("C_" . strtoupper($entete_officiel_abbrev), $k); |
$colonnes_reconnues[$k] = 1; |
break; |
268,7 → 350,8 |
if(! array_filter($ligne, function($cell) { return !is_null($cell); })) continue; |
|
if( ($enregistrement = self::chargerLigne($ligne, $dernier_ordre, $cel)) ) { |
$enregistrements[] = array_merge($colonnes_statiques, $enregistrement); |
// $enregistrements[] = array_merge($colonnes_statiques, $enregistrement); |
$enregistrements[] = $enregistrement; |
|
if(isset($enregistrement['_images'])) { |
$pos = count($enregistrements) - 1; |
291,22 → 374,12 |
} |
|
|
static function stockerEnregistrements($cel, $enregistrements) { |
$req = ''; |
|
foreach($enregistrements as $enregistrement) { |
static function trierColonnes(&$enregistrements) { |
foreach($enregistrements as &$enregistrement) { |
$enregistrement = self::sortArrayByArray($enregistrement, self::$ordre_BDD); |
array_walk($enregistrement, |
function(&$item, $k, $obj) { $item = is_null($item) ? "NULL" : $item; }, |
$cel); |
$req .= implode(', ', $enregistrement) . "\n"; |
//array_walk($enregistrement, function(&$item, $k) { $item = is_null($item) ? "NULL" : $item; }); |
//$req .= implode(', ', $enregistrement) . "\n"; |
} |
echo "$req\n"; |
// TODO: insert |
|
// $cel->executer($req); |
// transactionnel + auto-inc |
return $cel->bdd->lastInsertId(); |
} |
|
|
377,7 → 450,7 |
"lieudit" => $cel->quoteNonNull(trim($ligne[C_LIEUDIT])), |
"station" => $cel->quoteNonNull(trim($ligne[C_STATION])), |
"milieu" => $cel->quoteNonNull(trim($ligne[C_MILIEU])), |
"commentaire" => $cel->quoteNonNull(trim($ligne[C_COMMENTAIRE])), // TODO: foreign-key |
"commentaire" => NULL, //$cel->quoteNonNull(trim($ligne[C_COMMENTAIRE])), // TODO: foreign-key |
|
|
"transmission" => in_array(strtolower(trim($ligne[C_TRANSMISSION])), array(1, 'oui')) ? 1 : 0, |
385,6 → 458,13 |
// $ligne: uniquement pour les infos en cas de gestion d'erreurs (lon/lat incompréhensible) |
"latitude" => self::traiterLonLat(NULL, $ligne[C_LATITUDE], $referentiel, $ligne), |
"longitude" => self::traiterLonLat($ligne[C_LONGITUDE], NULL, $referentiel, $ligne), |
|
// @ car potentiellement optionnelles ou toutes vides => pas d'index dans PHPExcel (tableau optimisé) |
"abondance" => @$ligne[C_ABONDANCE], |
"certitude" => @$ligne[C_CERTITUDE], |
"phenologie" => @$ligne[C_PHENOLOGIE], |
|
"code_insee_calcule" => $localisation[C_CE_ZONE_GEO] // TODO ? |
); |
|
// passage de $enregistrement par référence, ainsi ['_images'] n'est défini |
398,7 → 478,7 |
static function traiterImage($str, $cel, &$enregistrement) { |
$liste_images = array_filter(explode("/", $str)); |
array_walk($liste_images, |
function($item, $key, $obj) { $item = $obj->quoteNonNull(trim($item)); }, |
function($item, $key, $obj) { $item = $obj->quoteNonNull_real(trim($item)); }, |
$cel); |
$requete = sprintf( |
"SELECT id_image, nom_original FROM cel_images WHERE ce_utilisateur = %d AND nom_original IN (\"%s\")", |
550,18 → 630,18 |
$nom_commune=$elements[1]; |
$code_commune=$elements[2]; |
$requete = sprintf("%s WHERE nom = %s AND code LIKE %s", |
$select, $cel->quoteNonNull($nom_commune), $cel->quoteNonNull($code_commune.'%')); |
$select, $cel->quoteNonNull_real($nom_commune), $cel->quoteNonNull_real($code_commune.'%')); |
} |
elseif (preg_match('/^(\d+|(2[ab]\d+))$/i', $identifiant_commune, $elements)) { |
// Code insee seul |
$code_insee_commune=$elements[1]; |
$requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull($code_insee_commune)); |
$requete = sprintf("%s WHERE code = %s", $select, $cel->quoteNonNull_real($code_insee_commune)); |
} |
else { |
// Commune seule (le departement sera recupere dans la colonne departement si elle est presente) |
// on prend le risque ici de retourner une mauvaise Commune |
$nom_commune = str_replace(" ", "%", iconv('UTF-8', 'ASCII//TRANSLIT', $identifiant_commune)); |
$requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull($nom_commune.'%')); |
$requete = sprintf("%s WHERE nom LIKE %s", $select, $cel->quoteNonNull_real($nom_commune.'%')); |
} |
|
$resultat_commune = $cel->requeter($requete); |
625,16 → 705,23 |
$this->colonnes_statiques = array_merge($this->colonnes_statiques, |
Array( |
"ce_utilisateur" => $this->id_utilisateur, |
"prenom_utilisateur" => $this->quoteNonNull($this->utilisateur['prenom']), |
"nom_utilisateur" => $this->quoteNonNull($this->utilisateur['nom']), |
"courriel_utilisateur" => $this->quoteNonNull($this->utilisateur['courriel']), |
"prenom_utilisateur" => $this->quoteNonNull_real($this->utilisateur['prenom']), |
"nom_utilisateur" => $this->quoteNonNull_real($this->utilisateur['nom']), |
"courriel_utilisateur" => $this->quoteNonNull_real($this->utilisateur['courriel']), |
)); |
|
} |
|
private function quoteNonNull_real($chaine) { |
if(is_null($chaine)) return "NULL"; |
if(!is_string($chaine)) die("erreur __FILE__, __LINE__"); |
return $this->bdd->quote($chaine); |
} |
|
// équivalent à CEL->Bdd->proteger() (qui wrap PDO::quote), |
// sans transformer NULL en "" |
private function quoteNonNull($chaine) { |
return $chaine; |
if(is_null($chaine)) return "NULL"; |
if(!is_string($chaine)) die("erreur __FILE__, __LINE__"); |
return $this->bdd->quote($chaine); |