【问题标题】:load data local infile mysql server php Ubuntu加载数据本地 infile mysql 服务器 php Ubuntu
【发布时间】:2015-03-23 20:51:54
【问题描述】:

我发布了这个解决方案,因为它让我发疯了几天——原来是 AppArmor 设置。这个线程终于让我解决了: How can I get around MySQL Errcode 13 with SELECT INTO OUTFILE?

我看到这被标记为重复,但所有其他建议似乎都指向编辑 my.cnf,这对我不起作用。

我无法让 Load Data Local Infile 工作。我的 MySQL 服务器版本是 5.5.41,我的 Ubuntu 版本是 14.04.2。我的 my.cnf 在 mysql、mysqld 和 client 下有“local-infile”。根据 Stackoverflow 上的另一篇文章,我在连接字符串中指定了标志 128。下面的代码在我在客户端上运行时效果很好,但现在它存在于服务器上,它会不断抛出

"此 MySQL 版本不允许使用的命令。

编辑,从命令行运行这个是成功的:

mysql> LOAD DATA LOCAL INFILE '/home/aa/ER.csv'
    ->      INTO TABLE ER_import
    ->      FIELDS TERMINATED BY ','
    ->      LINES TERMINATED BY '\r\n'
    ->      IGNORE 1 LINES
    ->     (Paid_Amount,
    -> Pro_Number,
    -> Invoice,
    -> Ship_Date,
    -> BL,
    -> Carrier_Name,
    -> Check_Number,
    -> Paid_Date,
    -> Shipper_City,
    -> Shipper_State,
    -> Shipper_Name_1,
    -> Recipient_City,
    -> Recipient_State,
    -> Recipient_Name_1,
    -> Batch_Number,
    -> Actual_Weight,
    -> Billed_Amount
    -> );
Query OK, 8585 rows affected, 4 warnings (0.21 sec)
Records: 8585  Deleted: 0  Skipped: 0  Warnings: 4

然而这不断重新调整该文件未找到:“文件'/home/aa/ER.csv'未找到(Errcode:13)”该文件肯定存在并且权限是正确的:

$delete = "DELETE FROM ER_import";

 if (!mysqli_query($conn,$delete))
   {
   echo("Error description: " . mysqli_error($conn));
   }

$query = <<<eof
    LOAD DATA INFILE '/home/aa/ER.csv'
     INTO TABLE ER_import
     FIELDS TERMINATED BY ','
     LINES TERMINATED BY '\r\n'
     IGNORE 1 LINES
    (Paid_Amount,
Pro_Number,
Invoice,
Ship_Date,
BL,
Carrier_Name,
Check_Number,
Paid_Date,
Shipper_City,
Shipper_State,
Shipper_Name_1,
Recipient_City,
Recipient_State,
Recipient_Name_1,
Batch_Number,
Actual_Weight,
Billed_Amount
);
eof;


if($results = mysqli_query($conn, $query)){
  echo $file. " has been imported!";
} else die(mysqli_error($conn));

有什么明显的吗??

【问题讨论】:

标签: php mysql ubuntu load-data-infile


【解决方案1】:

试试这个方法

$query = <<<eof
    LOAD DATA LOCAL INFILE DIR_FILE
     INTO TABLE ER_import
     FIELDS TERMINATED BY ','
     LINES TERMINATED BY '\r\n'
     IGNORE 1 LINES
eof;

$query = str_replace('DIR_FILE',$dir.$file,$query);

因为&lt;&lt;&lt;eof 表示您不希望 php 解析以下字符串中的任何内容。但是您正在尝试$dir$file,这意味着您期望 php 将用值替换此变量。

【讨论】:

    【解决方案2】:

    LOAD DATA LOCAL INFILE 中的 LOCAL 的含义有一个不直观的转折。当您加载的文件不是服务器本地时,您只需要使用LOCALLOCAL 告诉 MySQL 客户端选择一个本地文件并将其放在服务器上的临时目录中。 https://dev.mysql.com/doc/refman/5.5/en/load-data.html

    当您在服务器上运行该 php 脚本时,尝试从命令中去掉 LOCAL 这个词。

    【讨论】:

      【解决方案3】:

      几年前我也遇到过同样的问题。

      需要为客户端和服务器启用local-infile。

      我建议您先尝试从命令行界面运行LOAD DATA LOCAL INFILE,然后再尝试使用 PHP。要确保来自客户端的连接启用 local-infile,请运行以下命令:

      mysql --local-infile=1 -h REPLACE_HOST_IP -u username -p

      祝你好运!

      【讨论】:

      • 有趣,我得到了这个错误:不允许主机'主机名'连接到这个 MySQL 服务器
      • 好吧,让我们先解决这个问题。我们需要确保服务器接受远程 mysql 连接。为此,请相应地修改您的 my.cnf 文件。还授予用户username 远程连接的访问​​权限:GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'
      • 我已经过去了——你在我的编辑中看到了什么明显的东西吗?
      猜你喜欢
      • 2011-05-25
      • 1970-01-01
      • 2015-09-07
      • 2016-07-29
      • 2012-10-26
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多