我最近移动了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还想要我做什么?
答案 0 :(得分:15)
您需要配置两者客户端和服务器以允许此命令:
确保服务器允许LOAD DATA LOCAL INFILE。在MySQL服务器上编辑/etc/my.cnf:
[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成功测试了上述代码示例。
如果您仍然遇到问题,您可能会构建一个不允许本地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脚本上传数据而导致错误的原因。
有两种解决方案可以解决这个问题: -
尝试通过命令行加载数据库,如果您无法访问命令行,则可以请求服务提供商为您上传。因为他必须运行简单的命令。
在文本编辑器中打开数据库文件,并检查使用了哪种编码的标题。然后读取数据并对其进行解码,然后运行insert命令。
如果问题没有解决,请告诉我..