LOAD DATA LOCAL INFILE在使用PDO的php 5.5中不起作用

时间:2013-11-26 19:52:43

标签: php mysql pdo

我最近移动了Web服务器,新的Web服务器有不同版本的PHP。

新服务器:PHP 5.5.3-1ubuntu2(cli) 旧服务器:PHP 5.3.10(cli)

在数据库服务器上,my.cnf设置为允许本地infile。 我可以使用来自以下的加载数据本地infile:

- HeidiSQL
- The command line client running on the new web server using --local-infile=1
- PHP, using PDO, from the old web server

然而,当我尝试从新的Web服务器连接时,使用PHP和PDO,我得到: 发生数据库问题:SQLSTATE [42000]:语法错误或访问冲突:1148此MySQL版本不允许使用该命令

的php.ini:

[MySQL]
; Allow accessing, from PHP's perspective, local files with LOAD DATA statements
; http://php.net/mysql.allow_local_infile
mysql.allow_local_infile = On

PDO构造函数:

$this->db_conn = new PDO("mysql:host=$host;dbname=$dbname;port=$port", $user, $pass, array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));

我还在PHP脚本中尝试了ini_set('mysql.allow_local_infile',1)和ini_set('mysql.allow_local_infile',true)。

需要LOCAL关键字,因为文件托管在Web服务器上,而不是数据库服务器上。

PHP 5.5还想要我做什么?

2 个答案:

答案 0 :(得分:15)

您需要配置两者客户端和服务器以允许此命令:

  1. 确保服务器允许LOAD DATA LOCAL INFILE。在MySQL服务器上编辑/etc/my.cnf:

    [server]
    local-infile=1
    
  2. 在PHP脚本中设置PDO属性:

    <?php
    
    $dsn = "mysql:host=localhost;dbname=test";
    $user = "root";
    $password = "root";
    $pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_LOCAL_INFILE=>1));
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $pdo->exec("LOAD DATA LOCAL INFILE 'foo.csv' INTO TABLE foo FIELDS TERMINATED BY ','");
    

    这需要在构造函数的驱动程序选项参数中设置,而不是在后续调用setAttribute()中设置。

    我刚刚在CentOS Linux 6.5上使用PHP 5.5.8和Percona Server 5.6.15成功测试了上述代码示例。

  3. 如果您仍然遇到问题,您可能会构建一个不允许本地infile的MySQL客户端或PDO。 http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html

    中描述了这些要求
      

    php.ini中的mysql.allow_local_infile选项与PDO无关。

答案 1 :(得分:0)

您的代码绝对正确无需更改,因为错误位于您的数据库文件中。

错误原因

由于您通过命令行创建了数据库备份并尝试通过自定义php脚本上传数据而导致错误的原因。

溶液

有两种解决方案可以解决这个问题: -

  1. 尝试通过命令行加载数据库,如果您无法访问命令行,则可以请求服务提供商为您上传。因为他必须运行简单的命令。

  2. 在文本编辑器中打开数据库文件,并检查使用了哪种编码的标题。然后读取数据并对其进行解码,然后运行insert命令。

  3. 如果问题没有解决,请告诉我..