在... PHP中禁止加载数据本地INFILE

时间:2011-10-03 16:49:45

标签: php mysql

我正在尝试使用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

13 个答案:

答案 0 :(得分:37)

检查文档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,
    ));

答案 1 :(得分:6)

今天有此问题,并通过在php.ini中设置以下内容解决了该问题

rm -f /Users/my_user_name/.cocoapods/repos/master/.git/index.lock

答案 2 :(得分:5)

根据the MySQL manual MySQL必须使用--enable-local-infile进行编译。来自该链接的评论:

  

你必须使用MySQL的完整路径编译PHP,否则它   将使用它的内部处理程序,它不适用于“新”LOAD   数据。

     

- with-mysql = / usr / local / mysql(假设您的MySQL位于此处)

     

您必须使用选项'--local-infile = 1'

启动MySQL守护程序

答案 3 :(得分:5)

更容易解决的问题是使用exec()

exec("mysql -u myuser -pMyPass -e \"USE mydb;TRUNCATE mytable;LOAD DATA INFILE '" . $file . "' IGNORE  INTO TABLE mytable;\"; ");

答案 4 :(得分:5)

我没有得到您得到的确切错误,但您无需确保以下内容:

通过添加到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用户文件权限

使用LOCAL时,这不是必需的。 LOCAL表示该文件位于客户端服务器上(安装了PHP),否则它会查看服务器位置(安装MySQL的位置)。

GRANT FILE ON *.* TO 'mysql_user'@'localhost' 

答案 5 :(得分:4)

2019+相关答案,但背景要稍微多一点

在PHP> 7.2.16和> 7.3.3中,mysqli.allow_local_infile的默认ini配置由changed from '1' to '0'控制(因此默认情况下已禁用)。

此伪指令只能通过PHP_INI_SYSTEM进行配置,因此ini_set()无效有效。

唯一的选择是将以下指令添加到您的php.ini文件中,不要忘记重新加载apache。

[MySQLi]
mysqli.allow_local_infile = On

答案 6 :(得分:1)

在RDS上访问MySQL时,我在EC2 Ubuntu 12.04 LTS实例上遇到了完全相同的问题:LOAD DATA LOCAL INFILE...在mysql控制台上工作正常但在PHP上没有。我发现它在使用MariaDB的另一台几乎完全相同的机器上工作正常(用二进制兼容的drop代替MySQL)。

所以我将MySQL客户端替换为MariaDB中的客户端,并且工作正常。

答案 7 :(得分:1)

无论警告如何,

LOAD DATA LOCAL INFILE都会执行。它适用于mysql客户端,因为它允许执行查询,忽略警告。虽然它后来打印出警告。它在PHP中拒绝,因为警告会停止脚本。

答案 8 :(得分:1)

如果您使用的是Ubuntu服务器,则可以尝试安装php5-mysqlnd

sudo apt-get install php5-mysqlnd

答案 9 :(得分:0)

可能在某些服务器上运行的最简单的解决方案是删除LOCAL,如:

原文:LOAD DATA LOCAL INFILE 新/它应该是:LOAD DATA INFILE

很奇怪,但是我发现这个解决方案可以在我的本地机器上运行,使用xampp,但是它不能在带有CentOS的实时服务器上运行,所以我要恢复代码并添加'LOCAL'。

答案 10 :(得分:0)

要解决PHP Symfony应用程序中的相同问题,需要在yml配置文件中启用此标志。这是一个示例:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            !php/const PDO::MYSQL_ATTR_LOCAL_INFILE: true
        # Skip the rest

还要注意如何在yml文件中引用PHP常量,并且该格式用于Symfony 3.4。对于旧版本,请查看Symfony doc

答案 11 :(得分:0)

对我有用的解决方案如下。在我设置相同脚本的第二台服务器上,需要添加mysqli_options。

app:v1-api

答案 12 :(得分:-2)

在php.ini中,插入“ mysqli.allow_local_infile = On”,然后重新启动