問題描述
我最近移動了網絡服務器,新的網絡服務器有不同版本的 PHP.
I've recently moved web servers, and the new web server has a different version of PHP.
新服務器:PHP 5.5.3-1ubuntu2 (cli)舊服務器:PHP 5.3.10 (cli)
New Server: PHP 5.5.3-1ubuntu2 (cli) Old Server: PHP 5.3.10 (cli)
在數據庫服務器上,my.cnf 設置為允許 local-infile.我可以從以下位置使用加載數據本地 infile:
On the database server, my.cnf is set to allow local-infile. I can use load data local infile from:
- HeidiSQL
- The command line client running on the new web server using --local-infile=1
- PHP, using PDO, from the old web server
但是,當我嘗試從新的 Web 服務器連接時,使用帶有 PDO 的 PHP,我得到:出現數據庫問題:SQLSTATE[42000]: Syntax error or access conflict: 1148 The used command is not allowed with this MySQL version
However, when I try to connect from the new web server, using PHP with PDO, I get: A database problem has occurred: SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version
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).
I've also tried ini_set('mysql.allow_local_infile', 1) and ini_set('mysql.allow_local_infile', true) in the PHP script.
需要 LOCAL 關鍵字,因為文件托管在 Web 服務器上,而不是數據庫服務器上.
The LOCAL keyword is needed because the files are hosted on the web server, not the database server.
PHP 5.5 還想從我這里得到什么?
What else does PHP 5.5 want from me?
推薦答案
您需要同時配置客戶端和服務器以允許此命令:
You need to configure both the client and the server to allow this command:
確保服務器允許 LOAD DATA LOCAL INFILE.在 MySQL 服務器上編輯/etc/my.cnf:
Make sure the server allows LOAD DATA LOCAL INFILE. Edit /etc/my.cnf on the MySQL server:
[server]
local-infile=1
在您的 PHP 腳本中設置 PDO 屬性:
Set the PDO attribute in your PHP script:
<?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()
的后續調用中設置.
This needs to be set in the driver options argument to the constructor, not in a subsequent call to setAttribute()
.
我剛剛在 CentOS Linux 6.5 上使用 PHP 5.5.8 和 Percona Server 5.6.15 成功測試了上述代碼示例.
I just tested the above code example successfully with PHP 5.5.8 and Percona Server 5.6.15 on CentOS Linux 6.5.
如果您仍然遇到問題,您可能有一個不允許 local-infile 的 MySQL 客戶端或 PDO 版本.http://dev.mysql 中描述了這些要求.com/doc/refman/5.6/en/load-data-local.html
If you still have trouble, you may have a build of the MySQL client or PDO that does not permit local-infile. The requirements are described in http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html
php.ini 中的 mysql.allow_local_infile
選項與 PDO 無關.
The mysql.allow_local_infile
option in your php.ini is not relevant to PDO.
這篇關于LOAD DATA LOCAL INFILE 在 php 5.5 中使用 PDO 不起作用的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!