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

Ric*_*rez 26 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);
Run Code Online (Sandbox Code Playgroud)

它使用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);
Run Code Online (Sandbox Code Playgroud)

再次..它适用于MySQL客户端,但不适用于PHP应用程序...我收到此错误:

LOAD DATA LOCAL INFILE forbidden in /path/to/my/application
Run Code Online (Sandbox Code Playgroud)

我读到这个问题与PHP的编译和使用mysqlnd有关.我使用的是PHP 5.3.8和MySQL 5.5.15,但我还没有找到解决方案.

其他信息:到目前为止,我发现的唯一帮助是一个开放的PHP错误:

nom*_*ime 41

检查文档http://php.net/manual/en/ref.pdo-mysql.php.

基本上你需要:

PDO::MYSQL_ATTR_LOCAL_INFILE => true
Run Code Online (Sandbox Code Playgroud)

设置为实例化.

例:

    $conn = new \PDO("mysql:host=$server;dbname=$database;", "$user", "$password", array(
        PDO::MYSQL_ATTR_LOCAL_INFILE => true,
    ));
Run Code Online (Sandbox Code Playgroud)

  • 根据文件,它不能在准备时设置,仅在建设时.虽然这确实解决了问题,所以+1. (7认同)
  • 这仅适用于PDO构造函数.即使在施工后立即调用**PDO :: setAttribute**也无法完成工作. (2认同)

Seb*_*ian 9

今天遇到了这个问题,并通过在php.ini中设置以下内容解决了

mysqli.allow_local_infile = On
Run Code Online (Sandbox Code Playgroud)


chr*_*ris 7

2019+ 相关答案,有更多背景信息:

在 PHP >7.2.16 和 >7.3.3 中mysqli.allow_local_infile,控制它的默认 ini 配置从“1”更改为“0”(因此现在默认禁用)。

这个指令是唯一配置通过PHP_INI_SYSTEM这样ini_set()无法正常工作。

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

[MySQLi]
mysqli.allow_local_infile = On
Run Code Online (Sandbox Code Playgroud)


Cli*_*ive 5

根据MySQL手册 MySQL必须编译--enable-local-infile.来自该链接的评论:

您必须使用MySQL的完整路径编译PHP,否则它将使用它的内部处理程序,它不能与"新"LOAD DATA一起使用.

--with-mysql =/usr/local/mysql(假设你的MySQL位于这里)

你必须使用选项'--local-infile = 1'启动MySQL守护进程


Gad*_*eem 5

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

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


MaX*_*MaX 5

我没有得到你得到的确切错误,但你不需要确保以下内容:

通过添加到my.cnf启用:

[mysql]
local-infile=1

[mysqld]
local-infile=1
Run Code Online (Sandbox Code Playgroud)

在PHP中告诉它可能使用LOCAL INFILE的连接

使用mysql:

mysql_connect(server,user,code,false,128); // 128 enables LOCAL INFILE
mysql_select_db(database);
Run Code Online (Sandbox Code Playgroud)

使用mysqli:

$conn = mysqli_init();
mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($conn,server,user,code,database);
Run Code Online (Sandbox Code Playgroud)

授予MySQL用户FILE权限

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

GRANT FILE ON *.* TO 'mysql_user'@'localhost' 
Run Code Online (Sandbox Code Playgroud)