我正在尝试使用LOAD DATA INFILE
将一些记录插入表中。不幸的是,它没有用。
这是一些细节
如果我使用此说明:
LOAD DATA INFILE 'file.txt'
INTO TABLE table_ex
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(field1, field2, field3, field4);
它使用MySQL客户端程序和PHP应用程序。通过这种方式,它将在我的MySQL安装的数据目录中查找该文件。
现在,如果我尝试使用LOCAL
选项执行指令,它只有在我使用mysql客户端时才有效,但不能用于PHP:
LOAD DATA LOCAL INFILE 'path/to/file/file.txt'
INTO TABLE table_ex
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(field1, field2, field3, field4);
再次..它适用于MySQL客户端,但不适用于PHP应用程序...我收到此错误:
LOAD DATA LOCAL INFILE forbidden in /path/to/my/application
我读到这个问题与PHP的编译和使用mysqlnd有关。我使用的是PHP 5.3.8和MySQL 5.5.15,但我还没有找到解决方案。
补充信息:到目前为止,我发现的唯一帮助是open PHP bug:
检查文档http://php.net/manual/en/ref.pdo-mysql.php。
基本上你需要:
PDO::MYSQL_ATTR_LOCAL_INFILE => true
设置为实例化。
例:
$conn = new \PDO("mysql:host=$server;dbname=$database;", "$user", "$password", array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
));
今天有这个问题,并通过在php.ini中设置以下解决它
mysqli.allow_local_infile = On
更容易解决的问题是使用exec()
exec("mysql -u myuser -pMyPass -e \"USE mydb;TRUNCATE mytable;LOAD DATA INFILE '" . $file . "' IGNORE INTO TABLE mytable;\"; ");
根据the MySQL manual,MySQL必须使用--enable-local-infile
编译。来自该链接的评论:
您必须使用MySQL的完整路径编译PHP,否则它将使用它的内部处理程序,它不能与“新”LOAD DATA一起使用。
--with-mysql = / usr / local / mysql(假设你的MySQL位于这里)
你必须使用选项'--local-infile = 1'启动MySQL守护进程
我没有得到你得到的确切错误,但你不需要确保以下内容:
通过添加到my.cnf启用:
[mysql]
local-infile=1
[mysqld]
local-infile=1
告诉PHP中的连接它可能使用LOCAL INFILE
使用mysql:
mysql_connect(server,user,code,false,128); // 128 enables LOCAL INFILE
mysql_select_db(database);
使用mysqli:
$conn = mysqli_init();
mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($conn,server,user,code,database);
授予MySQL用户FILE权限
但是,当使用LOCAL时,这不是必需的。 LOCAL表示该文件位于客户端服务器上(安装了PHP),否则它会查看服务器位置(安装MySQL的位置)。
GRANT FILE ON *.* TO 'mysql_user'@'localhost'
在RDS上访问MySQL时,我在EC2 Ubuntu 12.04 LTS实例上遇到了完全相同的问题:LOAD DATA LOCAL INFILE...
在mysql控制台上工作正常,但不能在PHP上工作。我发现它在另一台使用MariaDB(二进制兼容的drop代替MySQL)的几乎相同的机器上运行良好。
所以我用MariaDB中的MySQL客户端替换了MySQL客户端并且它有效。
无论警告如何,LOAD DATA LOCAL INFILE
都会执行。它适用于mysql客户端,因为它允许执行查询,忽略警告。虽然它后来打印出警告。它在PHP中拒绝,因为警告会停止脚本。
如果您使用的是Ubuntu服务器,则可以尝试安装php5-mysqlnd
:
sudo apt-get install php5-mysqlnd
可能在某些服务器上运行的最简单的解决方案是删除LOCAL,如:
原文:LOAD DATA LOCAL INFILE新/它应该是:LOAD DATA INFILE
奇怪,但我发现这个解决方案可以在我的本地机器上使用xampp,但它在带有CentOS的实时服务器上不起作用,所以我要恢复代码并添加'LOCAL'。