【问题标题】:load data infile is not working加载数据文件不起作用
【发布时间】:2015-12-16 21:59:51
【问题描述】:

我正在尝试通过 csv 文件批量上传。我的 csv 文件位于 webroot/CSV/data.csv。数据如下:

name,email
santo, abc@gmail.com

我的代码:

$sql = "LOAD DATA INFILE '$filepath'
    INTO TABLE customers
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '\"' 
    LINES TERMINATED BY ',,,\\r\\n'
    IGNORE 1 LINES 
    (name, email)";
    $this->Customer->query($sql);

这里

$filepath = WWW_ROOT . 'CSV' . DS.'data.csv';

得到错误:

C:\server\mysql\data\serverhtdocsdemo-home25appwebrootCSVdata.csv' not found (Errcode: 2 "No such file or directory")

我检查了它存在的文件,并且 sql 中的文件位置似乎没问题:

SQL Query: LOAD DATA INFILE 'C:\server\htdocs\demo-home25\app\webroot\CSV\data.csv' INTO TABLE customers FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY ',,,\r\n' IGNORE 1 LINES (name, email)

我的代码有什么问题?

【问题讨论】:

  • 你确定你已经定义了DS,它不是PHP定义的值,你必须自己设置。您还需要在WWW_ROOT . 'CSV' 之间有一个DS,即WWW_ROOT . DS . 'CSV',一旦您实际定义了它。我建议在 DS 中也使用 unix 正斜杠而不是 DOS 反斜杠。
  • $sql 之前的 $filepath 变量的确切内容是什么?
  • 按照我的解释,我将 csv 文件的路径设置为 $filepath 变量,即: $filepath = WWW_ROOT 。 'CSV' 。 DS.'data.csv'; @Rydrych
  • WWW_ROOT 据我所知自动添加斜杠。我也检查一下。 RiggsFolly

标签: php csv


【解决方案1】:

您尝试使用“LOAD DATA LOCAL INFILE”吗?

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

在你的情况下:

$sql = "LOAD DATA LOCAL INFILE '$filepath'
    INTO TABLE customers
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '\"' 
    LINES TERMINATED BY ',,,\\r\\n'
    IGNORE 1 LINES 
    (name, email)";
    $this->Customer->query($sql);

"如果指定了 LOCAL,则文件由客户端主机上的客户端程序读取并发送到服务器。"来自Documentation

已回复https://stackoverflow.com/a/14133740/2925795

【讨论】:

  • 谢谢。现在它显示另一个错误: PDOStatement::execute() [pdostatement.execute]: LOAD DATA LOCAL INFILE disabled [CORE\Cake\Model\Datasource\DboSource.php, line 460]
  • 查看用户在mysql中的权限。如果没有解决,这里还有其他类似情况link
【解决方案2】:

我有同样的问题。有时,您的 mysql 服务器和客户端对文件位置的理解不同。

LOCAL 修饰符(如LOAD DATA LOCAL INFILE)添加到您的查询中

$sql = "LOAD DATA LOCAL INFILE '$filepath'
INTO TABLE customers
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"' 
LINES TERMINATED BY ',,,\\r\\n'
IGNORE 1 LINES 
(name, email)";
$this->Customer->query($sql);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2013-08-04
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多