【问题标题】:CSV Upload with PHP/MySQL使用 PHP/MySQL 上传 CSV
【发布时间】:2014-01-24 12:11:16
【问题描述】:

我已经尝试将 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>

【问题讨论】:

  • 您是否尝试过通过 SQL 控制台而不是通过 PHP 运行相同的查询?然后您可以确定是您的代码问题还是您的查询问题。
  • 你的 csv 结构是什么样的?你的数据库表是什么样子的?
  • @JamesBaker 刚刚告诉我访问被拒绝。这是我对用户的 blummin 读写访问导致我出现问题吗?
  • 可能,或者可能是您正在使用的 SQL 用户的用户权限。

标签: php html mysql csv


【解决方案1】:

当我必须将 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);
)

您有两个选项可以实际导入数据库:

  1. 构建导入 sql 查询的集合并批量执行 (array_chunk) - 这意味着对您的数据库的查询更少。但是,正如您所看到的,我没有检查 CSV 中的值 - 即我相信我的数据源并且没有转义任何东西 - 有点危险......

  2. 只要您使用转义值构建查询,您就可以执行查询 - 小缺点是它将在 csv 中每行执行一个查询......

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多