LOAD DATA LOCAL INFILE在使用PDO的php 5.5中不起作用
我最近移动了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对我有什么要求?
您需要都的客户端和服务器配置为允许该命令:
-
确保服务器允许LOAD DATA LOCAL INFILE。编辑/etc/my.cnf中的MySQL服务器上:
[server] local-infile=1
-
设置在你的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描述。
您的代码绝对正确无需更改,因为错误在于您的数据库文件。
错误原因
如您通过命令行创建的数据库备份,并试图通过上传自定义的PHP脚本数据的错误的原因造成的。
解决方案
有可用的解决了这个问题2个解决方案: -
尝试通过命令行装载数据库,如果你没有进入命令行,那么你可以问您的服务提供商为你上传。因为他必须运行简单的命令。
在文本编辑器中打开数据库文件并检查使用哪种编码。然后读取数据并解码,然后运行插入命令。
如果问题解决犯规然后让我知道..
和你的MySQL版本? – Hackerman
这可能是一个权限问题?就我所知,PDO在这方面没有做任何特别的事情。 – tadman
MySQL Database: mysql Ver 14.14 Distrib 5.1.69,用于使用readline 5.1的redhat-linux-gnu(x86_64)。 托管在CentOS 5. 我在所有测试中使用相同的用户名和密码,所以它不应该是MySQL权限问题。 PHP脚本由root执行。 – NotEnoughGolds