par
moogli » 13 janv. 2017, 13:43
salut,
ton format de date est un format français et il y a peu (pas du tout en fait) de chance que ton sgbd le comprenne nativement.
il faut pour cela lui indiquer le format.
pour cela mysql utilise
str_to_date (et
date_format pour faire l'inverse).
dans ce cas, si tu as un champs date
$sql .= ' str_to_date(\'' . $data[0] . '\', \'%d/%m/%Y %h:%i:%s\')';
tu peux aussi lire beaucoup plus simplement ton fichier.
avec la fonction
glob[url] tu auras un tableau avec une ligne de ... str_getcsv tu auras un tableau correspondant correspondant à la ligne courante.
Si tu utilises PDO je t'invites à utiliser les requêtes préparées plutôt qu'un insert reconstruit a chaque fois (et se sera plus claire à utiliser).
tu peux aussi utiliser un objet
SplFileObject pour simplifier encore un peu le code

(ou le rendre plus lisible)
je ferais ainsi
<?php
// classe singleton qui gère la connexion à la base de données cela évite d'en créer une a caque fois que l'on a besoin d’accéder à la base ;)
final class MyBdd {
private static $cnx;
final static function getConnexion(){
if(self::$cnx === null){
$options = [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
self::$cnx = new PDO('mysql:host=localhost;dbname=test','test','test',$options);
}
return self::$cnx;
}
}
// un objet ce serait mieux :)
function importDataCOTCOV($fileName, $fileId){
$dbCnx = MyBdd::getConnexion();
$file = new SplFileObject($fileName);
$file->setFlags(SplFileObject::READ_CSV);
// on indique le séparateur csv, ici le point virgule
$file->setCsvControl(';');
// préparation de la requête SQL
$stmt = $dbCnx->prepare('insert into tvaluecot (date1, value, id_fichier) values (str_to_date(:dte,\'%d/%m/%Y %H:%i\'), :value, :fileid)');
// lui y change jamais à priori
$stmt->bindValue(':fileid', $fileId, PDO::PARAM_INT);
while (!$file->eof()) {
// on récupère la ligne au format csv
$line = $file->fgetcsv();
$stmt->bindValue(':dte',$line[0]);
$stmt->bindValue(':value',$line[1],PDO::PARAM_INT);
$stmt->execute();
}
$stmt->closeCursor();
}
try {
// le test
importDataCOTCOV('olimarine.csv',1337);
// vérification que l'on a bien inséré les données (la table est vide avant le test)
$cnx = MyBdd::getConnexion();
$stmt = $cnx->query('select * from tvaluecot');
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
// si tu n'as pas l'extension xdebug (c'est un tors :) ) utilise var_dump() à la place
xdebug_var_dump($data);
}catch(PDOException $e){
xdebug_var_dump($e);
}
cela insère une ligne en base par ligne de fichier
avec
Code : Tout sélectionner
01/11/2016 00:00;0;01/11/2016 00:00;0
01/11/2016 00:01;1;01/11/2016 00:01;0
01/11/2016 00:02;2;01/11/2016 00:02;0
j'obtient
Code : Tout sélectionner
array (size=3)
0 =>
array (size=4)
'id' => int 8
'date1' => string '2016-11-01' (length=10)
'value' => int 0
'id_fichier' => int 1337
1 =>
array (size=4)
'id' => int 9
'date1' => string '2016-11-01' (length=10)
'value' => int 1
'id_fichier' => int 1337
2 =>
array (size=4)
'id' => int 10
'date1' => string '2016-11-01' (length=10)
'value' => int 2
'id_fichier' => int 1
la table de test
create table tvaluecot (
id int not null auto_increment primary key,
date1 date not null,
value int not null,
id_fichier int not null
);
@+
salut,
ton format de date est un format français et il y a peu (pas du tout en fait) de chance que ton sgbd le comprenne nativement.
il faut pour cela lui indiquer le format.
pour cela mysql utilise [url=https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to-date]str_to_date[/url] (et [url=https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format]date_format[/url] pour faire l'inverse).
dans ce cas, si tu as un champs date
$sql .= ' str_to_date(\'' . $data[0] . '\', \'%d/%m/%Y %h:%i:%s\')';
tu peux aussi lire beaucoup plus simplement ton fichier.
avec la fonction [url=http://php.net/glob]glob[url] tu auras un tableau avec une ligne de ligne pas ligne de tableau (pratique non ? ;) )
avec la fonction [url=http://php.net/str_getcsv]str_getcsv[/url] tu auras un tableau correspondant correspondant à la ligne courante.
Si tu utilises PDO je t'invites à utiliser les requêtes préparées plutôt qu'un insert reconstruit a chaque fois (et se sera plus claire à utiliser).
tu peux aussi utiliser un objet [url=https://secure.php.net/manual/fr/class.splfileobject.php]SplFileObject[/url] pour simplifier encore un peu le code ;) (ou le rendre plus lisible)
je ferais ainsi [php]<?php
// classe singleton qui gère la connexion à la base de données cela évite d'en créer une a caque fois que l'on a besoin d’accéder à la base ;)
final class MyBdd {
private static $cnx;
final static function getConnexion(){
if(self::$cnx === null){
$options = [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
self::$cnx = new PDO('mysql:host=localhost;dbname=test','test','test',$options);
}
return self::$cnx;
}
}
// un objet ce serait mieux :)
function importDataCOTCOV($fileName, $fileId){
$dbCnx = MyBdd::getConnexion();
$file = new SplFileObject($fileName);
$file->setFlags(SplFileObject::READ_CSV);
// on indique le séparateur csv, ici le point virgule
$file->setCsvControl(';');
// préparation de la requête SQL
$stmt = $dbCnx->prepare('insert into tvaluecot (date1, value, id_fichier) values (str_to_date(:dte,\'%d/%m/%Y %H:%i\'), :value, :fileid)');
// lui y change jamais à priori
$stmt->bindValue(':fileid', $fileId, PDO::PARAM_INT);
while (!$file->eof()) {
// on récupère la ligne au format csv
$line = $file->fgetcsv();
$stmt->bindValue(':dte',$line[0]);
$stmt->bindValue(':value',$line[1],PDO::PARAM_INT);
$stmt->execute();
}
$stmt->closeCursor();
}
try {
// le test
importDataCOTCOV('olimarine.csv',1337);
// vérification que l'on a bien inséré les données (la table est vide avant le test)
$cnx = MyBdd::getConnexion();
$stmt = $cnx->query('select * from tvaluecot');
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
// si tu n'as pas l'extension xdebug (c'est un tors :) ) utilise var_dump() à la place
xdebug_var_dump($data);
}catch(PDOException $e){
xdebug_var_dump($e);
}[/php]
cela insère une ligne en base par ligne de fichier
avec
[code]01/11/2016 00:00;0;01/11/2016 00:00;0
01/11/2016 00:01;1;01/11/2016 00:01;0
01/11/2016 00:02;2;01/11/2016 00:02;0[/code]
j'obtient
[code]
array (size=3)
0 =>
array (size=4)
'id' => int 8
'date1' => string '2016-11-01' (length=10)
'value' => int 0
'id_fichier' => int 1337
1 =>
array (size=4)
'id' => int 9
'date1' => string '2016-11-01' (length=10)
'value' => int 1
'id_fichier' => int 1337
2 =>
array (size=4)
'id' => int 10
'date1' => string '2016-11-01' (length=10)
'value' => int 2
'id_fichier' => int 1[/code]
la table de test[sql]create table tvaluecot (
id int not null auto_increment primary key,
date1 date not null,
value int not null,
id_fichier int not null
);[/sql]
@+