Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1647 → Rev 1648

/trunk/jrest/services/ImportXLS.php
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);