2013-11-26 52 views
7

我最近移动了web服务器,并且新的web服务器有不同版本的PHP。LOAD DATA LOCAL INFILE在使用PDO的php 5.5中不起作用

新服务器: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对我有什么要求?

+0

和你的MySQL版本? – Hackerman

+1

这可能是一个权限问题?就我所知,PDO在这方面没有做任何特别的事情。 – tadman

+0

MySQL Database: mysql Ver 14.14 Distrib 5.1.69,用于使用readline 5.1的redhat-linux-gnu(x86_64)。 托管在CentOS 5. 我在所有测试中使用相同的用户名和密码,所以它不应该是MySQL权限问题。 PHP脚本由root执行。 – NotEnoughGolds

回答

15

您需要的客户端和服务器配置为允许该命令:

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

    [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成功测试了上面的代码示例。

如果仍有问题,您可能会生成MySQL客户端或不允许本地入侵的PDO。的要求在http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html

在php.ini的mysql.allow_local_infile选项是不相关的PDO描述。

0

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

错误原因

如您通过命令行创建的数据库备份,并试图通过上传自定义的PHP脚本数据的错误的原因造成的。

解决方案

有可用的解决了这个问题2个解决方案: -

  1. 尝试通过命令行装载数据库,如果你没有进入命令行,那么你可以问您的服务提供商为你上传。因为他必须运行简单的命令。

  2. 在文本编辑器中打开数据库文件并检查使用哪种编码。然后读取数据并解码,然后运行插入命令。

如果问题解决犯规然后让我知道..