提问人:Richard Pérez 提问时间:10/4/2011 最后编辑:hopperRichard Pérez 更新时间:7/6/2023 访问量:88061
LOAD DATA LOCAL INFILE 禁止在...PHP的
LOAD DATA LOCAL INFILE forbidden in... PHP
问:
我正在尝试将一些记录插入到表中。不幸的是,它不起作用。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安装的数据目录中查找该文件。
现在,如果我尝试使用该选项执行指令,它仅在我使用 mysql 客户端时有效,但不能从 PHP 中起作用:LOCAL
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,但我还没有找到解决方案。
附加信息:到目前为止,我发现的唯一帮助是一个开放的PHP错误:
答:
根据MySQL手册,MySQL必须用 编译。从该链接的评论中:--enable-local-infile
您必须使用 MySQL 的完整路径编译 PHP,否则它 将使用它的内部处理程序,这些处理程序不适用于“新”加载 数据。
--with-mysql=/usr/local/mysql(假设您的MySQL位于此处)
您必须使用选项“--local-infile=1”启动 MySQL 守护程序
评论
更简单的解决方法是使用 exec()
exec("mysql -u myuser -pMyPass -e \"USE mydb;TRUNCATE mytable;LOAD DATA INFILE '" . $file . "' IGNORE INTO TABLE mytable;\"; ");
评论
exec()
--local-infile
在 RDS 上访问 MySQL 时,我在 EC2 Ubuntu 12.04 LTS 实例上遇到了完全相同的问题:在 mysql 控制台上工作正常,但不能从 PHP 工作。我意外地发现它在另一台使用 MariaDB(MySQL 的二进制兼容替代品)的几乎相同的机器上运行良好。LOAD DATA LOCAL INFILE...
因此,我用MariaDB中的客户端替换了MySQL客户端,并且它起作用了。
LOAD DATA LOCAL INFILE
执行,而不考虑警告。它适用于MySQL客户端,因为它允许执行查询,忽略警告。虽然它后来打印出警告。不过,它在 PHP 中拒绝,因为警告会停止脚本。
我没有收到您得到的确切错误,但您无需确保以下几点:
通过向 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'
评论
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,
));
评论
可能在某些服务器上起作用的最简单解决方案是删除 LOCAL,例如:
原作者:LOAD DATA LOCAL INFILE 新建/应该是:LOAD DATA INFILE
很奇怪,但我发现这个解决方案可以在我的本地机器上使用 xampp,但它不适用于带有 CentOS 的实时服务器,所以我会恢复代码并添加“LOCAL”。
评论
如果您使用 Ubuntu 服务器,您可以尝试安装:php5-mysqlnd
sudo apt-get install php5-mysqlnd
评论
今天遇到了这个问题,并通过在php.ini中设置以下内容来解决它
mysqli.allow_local_infile = On
评论
2019+ 相关答案,背景更丰富:
在 PHP >7.2.16 和 >7.3.3 中,控制它的默认 ini 配置从 '1' 更改为 '0'(因此现在默认禁用)。mysqli.allow_local_infile
此指令只能通过以下方式进行配置,因此不起作用。PHP_INI_SYSTEM
ini_set()
唯一的选择是将以下指令添加到您的php.ini文件中,不要忘记重新加载 apache。
[MySQLi]
mysqli.allow_local_infile = On
取消注释 'mysqli.allow_local_infile = On' in php.ini.
为了解决 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 文档。
评论
对我有用的解决方案如下。需要在已设置相同脚本的第二台服务器上添加mysqli_options。
$mysqli = new
mysqli("$db_server_name","$db_user_name","$db_password","$database_name");
// force LOCAL_INFILE
mysqli_options($mysqli, MYSQLI_OPT_LOCAL_INFILE, true);
2023 版答案:
未捕获mysqli_sql_exception:禁止加载数据本地 INFILE;
Ubuntu Linux 和 Windows 的最佳解决方案
- 让我们通过命令检查服务器上运行的PHP版本
php -i | grep php.ini
在终端上:复制提供的路径,例如 Loaded Configuration File => /etc/php/8.2/cli/php.ini
只需复制文件路径并运行以下命令并编辑php.ini文件即可。我正在使用 nano 编辑器
sudo nano /etc/php/8.2/fpm/php.ini
注意!取消注释该行
mysqli.allow_local_infile = On
按 ctrl+s 保存,按 ctrl+x 退出
现在刷新php.ini文件以影响我们所做的更改
service php8.2-fpm restart
或
在 Windows 上
- 只需以管理员身份打开php.ini文件并取消注释下面的行,然后保存即可。限制已解决。
mysqli.allow_local_infile = On
评论