我一直试图将一个csv文件上传到我的数据库中1周,我已经阅读了无数的教程并且不知道我做错了什么,这是一个简单的代码,我太愚蠢了。任何帮助都将是金色的! :)
if(isset($_FILES['file'])){
$csv_file = $_FILES['file']['name'];
$sql = <<<eof
LOAD DATA INFILE '$csv_file'
INTO TABLE test_csv
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(name,house,po)
eof;
$result = $dbh->query($sql);
}
echo $csv_file .' has successfully been loaded';
?>
<!DOCTYPE html>
<html>
<head>
<title>CSV to MySQL Via PHP</title>
</head>
<body>
<form enctype="multipart/form-data" method="POST">
<input name="file" type="file">
<input type="submit" value="Upload">
</form>
</body>
</html>
答案 0 :(得分:2)
当我不得不将CSV导入数据库表时,我总是编写自己的csv解析器/导入器。这很简单。
这是一个例子。
<强> test.csv 强>
Firstname,Lastname,Age
"Latheesan","Kanes",26
"Adam","Smith",30
<强> test.php的强>
<?php
// Mini Config
$csv_file = 'test.csv';
$delimiter = ',';
$enclosure = '"';
$skip_first_row = true;
$import_chunk = 250;
// Parse CSV & Build Import Query
$import_queries = array();
$first_row_skipped = false;
if (($handle = fopen($csv_file, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, $delimiter, )) !== FALSE) {
if ($skip_first_row && !$first_row_skipped) {
$first_row_skipped = true;
continue;
}
list($firstname, $lastname, $age) = $data;
$import_queries[] = "INSERT INTO myTable (firstname, lastname, age) VALUES ('$firstname', '$lastname', $age);";
}
fclose($handle);
}
// Proceed if any data got parsed
if (sizeof($import_queries))
{
foreach(array_chunk($import_queries, $import_chunk) as $queries)
{
$dbh->query(implode(' ', $queries));
}
}
?>
解析后的查询将如下所示(如果您print_r
):
Array
(
[0] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Latheesan', 'Kanes', 26);
[1] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Adam', 'Smith', 30);
)
实际导入数据库有两个选项:
构建一个import sql查询集合并在批处理中执行它(array_chunk) - 这意味着对db的查询次数减少。但是你可以看到,我没有检查CSV中的值 - 即我相信我的数据源而不是逃避任何东西 - 有点危险......
你执行查询,只要你通过转义值来构建它 - 小的缺点就是它会在csv中每行执行一个查询....
希望这有帮助。