Slu!
Ca ne fonctionne pas, le code bloque :
$stmt = $pdo->prepare('INSERT INTO `' . $table . '` (dtlog, glot) VALUES (str_to_date(:dt,\'%Y%m%d\'),:glot) ON DUPLICATE KEY UPDATE dtlog = \'str_to_date(:dt,\'%Y%m%d\')\'');
Erreur :
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '')'' at line 1 #0 CRONMETEO.php(35): PDO->prepare('INSERT INTO `44...')
#1 {main}
et d'ailleurs après réflexion mon code initial ci-dessous devrait logiquement fonctionner puisque str_to_date(:dt,\'%Y%m%d\') est déjà dans les valeurs :
$stmt = $pdo->prepare('INSERT INTO `' . $table . '` (dtlog, glot) VALUES (str_to_date(:dt,\'%Y%m%d\'),:glot) ON DUPLICATE KEY UPDATE dtlog = str_to_date(:dt,\'%Y%m%d\')');
Erreur :
SQLSTATE[HY093]: Invalid parameter number #0 CRONMETEO.php(44): PDOStatement->execute() #1 {main}
Vraiment je ne comprend pas pourquoi ca fonctionne dans les VALUES et pas dans le ON DUPLICATE KEY, la tablea à bien une primary key : dtlog DATE PRIMARY KEY, glot INT
Voici le code complet :
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=cronmeteo', 'cronmeteo', 'PASSWORD');
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER);
$pdo2 = new PDO('mysql:host=localhost;dbname=cronmeteoarchives', 'cronmeteo', 'PASSWORD');
$pdo2->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$pdo2->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
$pdo2->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
$pdo2->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER);
$tmpFolder = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR;
$finalFolder = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'archives' . DIRECTORY_SEPARATOR;
$originalDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'publitheque' . DIRECTORY_SEPARATOR;
$dir = new DirectoryIterator($originalDir);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot() && $fileinfo->isFile() && pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION) == 'data') {
rename($originalDir . $fileinfo->getFilename(), $tmpFolder . $fileinfo->getFilename());
$tabFile = file($tmpFolder . $fileinfo->getFilename());
preg_match('/^fic(\d+)-(\d+)-(\d+)-(\d+).data$/', $fileinfo->getFilename(), $match);
$table = $match[1];
$testtable1 = $pdo->query("SHOW TABLES LIKE '$table'");
$testtable2 = $pdo2->query("SHOW TABLES LIKE '$table'");
if ($testtable1->rowCount()>0){
$stmt = $pdo->prepare('INSERT INTO `' . $table . '` (dtlog, glot) VALUES (str_to_date(:dt,\'%Y%m%d\'),:glot) ON DUPLICATE KEY UPDATE dtlog = dtlog');
if (count($tabFile) > 0) {
unset($tabFile[0]);
$i = 0;
foreach ($tabFile as $line) {
$csv = str_getcsv($line, ';');
$stmt->bindValue(':dt', $csv[1]);
$stmt->bindValue(':glot', $csv[2], PDO::PARAM_INT);
$stmt->execute();
$testtable1->closeCursor();
$i++;
rename($tmpFolder . $fileinfo->getFilename(), $finalFolder . $fileinfo->getFilename());
}
}
}elseif ( $testtable2->rowCount()>0){
$stmt = $pdo2->prepare('INSERT INTO `' . $table . '` (dtlog, glot) VALUES (str_to_date(:dt,\'%Y%m%d\'),:glot) ON DUPLICATE KEY UPDATE dtlog = dtlog');
if (count($tabFile) > 0) {
unset($tabFile[0]);
$i = 0;
foreach ($tabFile as $line) {
$csv = str_getcsv($line, ';');
$stmt->bindValue(':dt', $csv[1]);
$stmt->bindValue(':glot', $csv[2], PDO::PARAM_INT);
$stmt->execute();
$testtable2->closeCursor();
$i++;
rename($tmpFolder . $fileinfo->getFilename(), $finalFolder . $fileinfo->getFilename());
}
}
}else{rename($tmpFolder . $fileinfo->getFilename(), $finalFolder . $fileinfo->getFilename());}
}
}
} catch (Exception $e) {
$to = 'MAIL';
$subject = 'ALERTE CRON METEO';
$msg = 'Attention, interruption du CRON meteo : '.$e->getMessage().' '.$e->getTraceAsString().'';
mail($to, $subject, $msg);
}