CSV 到数据库 php
CSV to database with php
我在将数据从 .csv 文件导入到 "ms access" 数据库时遇到一点问题。
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv"/>
<input type="submit" name="submit"/>
</form>
<?php
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
$import=$db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
while (($data = fgetcsv($handle, 1000, "\t", "'")) !== FALSE) {
if($i>0) {
$data = str_replace('"', '', $data);
$myDate = date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
$import->bindParam(1, $myDate, PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
}
$i++;
}
/*$removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
$removal->execute();*/
fclose($handle);
echo 'IMPORTED' ;
}
CSV 文件:
导入结果:
我不知道为什么我的文件没有被导入,这个随机日期是什么时候。请协助!
编辑:
Var_dump:
编辑 2
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv"/>
<input type="submit" name="submit"/>
</form>
<?php
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
$import=$db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
while (($data = fgetcsv($handle, 1000, "\t", "'")) !== FALSE) {
if($i>0) {
$data = str_replace('"', '', $data);
$myDate = date("Y-m-d H:i",strtotime($data[0]));
$import->bindParam(1, $myDate, PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
var_dump($data);
}
$i++;
}
/*$removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
$removal->execute();*/
fclose($handle);
echo 'IMPORTED' ;
}
编辑 3
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
$import=$db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering)
VALUES(:dateandtime, :lastname, :paidtime, :approvedtime, :notadhering)");
while (($data = fgetcsv($handle, 1000, "\t", "'")) !== FALSE) {
if($i>0) {
$myDate = date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
$import->execute(array(':dateandtime'=> $myDate, ':lastname'=> $data[1], ':paidtime'=> $data[2], ':approvedtime'=> $data[3], ':notadhering'=> $data[4]));
}
$i++;
}
/*$removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
$removal->execute();*/
fclose($handle);
echo 'IMPORTED' ;
}
编辑 4 完整代码
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv"/>
<input type="submit" name="submit"/>
</form>
<?php
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
try {
$import= $db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
$i = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i > 0) {
$data = str_replace('"', '', $data);
$import->bindParam(1, $data[0], PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
}
$i++;
}
}
catch(PDOException $e) {
echo $e->getMessage()."\n";
}}
连接正常。它是.MDB
您的根本问题是您没有在 fgetcsv()
函数中指定逗号分隔符。结果,所有数据都被推入一列,date[0]
并且 Access ACE/JET 引擎无法转换为第一列的 date/time 呈现为零,在 unix time begins在 1/1/1970.
此外,考虑使用 try/catch
来捕获 PDO 异常。
try {
$import= $dbh->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
$i = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i > 0) {
$data = str_replace('"', '', $data);
$import->bindParam(1, $data[0], PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
}
$i++;
}
}
catch(PDOException $e) {
echo $e->getMessage()."\n";
}
至于日期,MS Access date/time 字段遵循当前 CPU 的语言时钟,例如 MM/DD/YYYY
(美国)或 DD/MM/YYYY
(英国)等. 它不遵循其他 RDMS 的 YYYY-MM-DD
或此类变体的 date/time 格式。因此无需转换,因为您的 csv 已经与 Access 格式对齐。话虽如此,您可能会收到警告:
SQLSTATE[22018]: Invalid character value for cast specification: -3030
但是,根据我的测试,数据库正确地更新了所有行。通常,您会将 #
连接到日期字符串周围,我尝试对您的代码无济于事,但可能在您的绑定参数过程中,字符串类型不能理想地用主题标签包装。
我在将数据从 .csv 文件导入到 "ms access" 数据库时遇到一点问题。
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv"/>
<input type="submit" name="submit"/>
</form>
<?php
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
$import=$db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
while (($data = fgetcsv($handle, 1000, "\t", "'")) !== FALSE) {
if($i>0) {
$data = str_replace('"', '', $data);
$myDate = date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
$import->bindParam(1, $myDate, PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
}
$i++;
}
/*$removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
$removal->execute();*/
fclose($handle);
echo 'IMPORTED' ;
}
CSV 文件:
导入结果:
我不知道为什么我的文件没有被导入,这个随机日期是什么时候。请协助!
编辑:
Var_dump:
编辑 2
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv"/>
<input type="submit" name="submit"/>
</form>
<?php
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
$import=$db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
while (($data = fgetcsv($handle, 1000, "\t", "'")) !== FALSE) {
if($i>0) {
$data = str_replace('"', '', $data);
$myDate = date("Y-m-d H:i",strtotime($data[0]));
$import->bindParam(1, $myDate, PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
var_dump($data);
}
$i++;
}
/*$removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
$removal->execute();*/
fclose($handle);
echo 'IMPORTED' ;
}
编辑 3
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
$import=$db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering)
VALUES(:dateandtime, :lastname, :paidtime, :approvedtime, :notadhering)");
while (($data = fgetcsv($handle, 1000, "\t", "'")) !== FALSE) {
if($i>0) {
$myDate = date("Y/m/d",strtotime(str_replace('/','-',$data[0])));
$import->execute(array(':dateandtime'=> $myDate, ':lastname'=> $data[1], ':paidtime'=> $data[2], ':approvedtime'=> $data[3], ':notadhering'=> $data[4]));
}
$i++;
}
/*$removal=$db->prepare("delete FROM adherence WHERE approvedtime = '0' OR notadhering IS NULL");
$removal->execute();*/
fclose($handle);
echo 'IMPORTED' ;
}
编辑 4 完整代码
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv"/>
<input type="submit" name="submit"/>
</form>
<?php
if (isset($_POST['submit'])) {
$i=0;
require "connection.php";
if (is_uploaded_file($_FILES['csv']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['csv']['name'] ." uploaded successfully." . "</h3>";
}
//Import uploaded file to Database
$handle = fopen($_FILES['csv']['tmp_name'], "r");
try {
$import= $db->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
$i = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i > 0) {
$data = str_replace('"', '', $data);
$import->bindParam(1, $data[0], PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
}
$i++;
}
}
catch(PDOException $e) {
echo $e->getMessage()."\n";
}}
连接正常。它是.MDB
您的根本问题是您没有在 fgetcsv()
函数中指定逗号分隔符。结果,所有数据都被推入一列,date[0]
并且 Access ACE/JET 引擎无法转换为第一列的 date/time 呈现为零,在 unix time begins在 1/1/1970.
此外,考虑使用 try/catch
来捕获 PDO 异常。
try {
$import= $dbh->prepare("INSERT INTO adherence(
dateandtime,
lastname,
paidtime,
approvedtime,
notadhering) VALUES(
?,?,?,?,?)");
$i = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i > 0) {
$data = str_replace('"', '', $data);
$import->bindParam(1, $data[0], PDO::PARAM_STR);
$import->bindParam(2, $data[1], PDO::PARAM_STR);
$import->bindParam(3, $data[2], PDO::PARAM_STR);
$import->bindParam(4, $data[3], PDO::PARAM_STR);
$import->bindParam(5, $data[4], PDO::PARAM_STR);
$import->execute();
}
$i++;
}
}
catch(PDOException $e) {
echo $e->getMessage()."\n";
}
至于日期,MS Access date/time 字段遵循当前 CPU 的语言时钟,例如 MM/DD/YYYY
(美国)或 DD/MM/YYYY
(英国)等. 它不遵循其他 RDMS 的 YYYY-MM-DD
或此类变体的 date/time 格式。因此无需转换,因为您的 csv 已经与 Access 格式对齐。话虽如此,您可能会收到警告:
SQLSTATE[22018]: Invalid character value for cast specification: -3030
但是,根据我的测试,数据库正确地更新了所有行。通常,您会将 #
连接到日期字符串周围,我尝试对您的代码无济于事,但可能在您的绑定参数过程中,字符串类型不能理想地用主题标签包装。