使用 local_infile ON 的 MariaDB 版本不允许使用命令
The used command is not allowed with this MariaDB version with local_infile ON
我知道,有几个问题关注的是同一个问题,但所有建议的修复方法都不适合我。
我正在 运行 编写一个 PHP 脚本,我试图在其中使用 LOAD DATA INFILE
像这样
将 CSV 文件插入我的数据库
$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($db, $db_host, $db_username, $db_password, $database);
$sql = "LOAD DATA LOCAL INFILE '" . $tpl_vars['filename'] . "' " .
"INTO TABLE " . $table_name . " " .
"FIELDS TERMINATED BY '" . $tpl_vars['delimiter'] . "' " .
"ENCLOSED BY '\"" . $tpl_vars['encapsulation'] . "' " .
"LINES TERMINATED BY '\n' " .
($tpl_vars['contains_header'] == 1 ? "IGNORE 1 ROWS" : "") . " " .
"(" . $columns . ") " .
$set;
$db->query($sql);
结果语句看起来像这样并且在语法上是正确的。 table 中存在的所有列。
LOAD data local INFILE '/path/to/file/file.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 rows (@category, @title, @price, @description)
SET category = @category, title = @title, price = @price, description = @description;
我得到的结果是
The used command is not allowed with this MariaDB version.
即使我 运行 phpMyAdmin 中的语句也会导致
2000 - LOAD DATA LOCAL INFILE is forbidden, check mysqli.allow_local_infile
因为我没有对我的服务器的完全 root 访问权限,所以我使用 ini_get_all()
检查了我的 php.ini,它返回了
mysqli.allow_local_infile: {global_value: "1", local_value: "1", access: 4}
检查 my.cnf 我 运行 SHOW VARIABLES
我的数据库。它返回
local_infile ON
据我所知,一切都配置得很好 运行 LOAD DATA LOCAL INFILE
。我错过了什么吗?
我的用户确实有以下 GRANTS
GRANT USAGE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD 'asdf'
GRANT ALL PRIVILEGES ON `db`.* TO 'user'@'localhost'
我在 MariaDB 10.1.44 和 PHP 5.5.38.
看来问题是我的用户没有文件授权。
GRANT FILE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD 'asdf'
成功了。
我知道,有几个问题关注的是同一个问题,但所有建议的修复方法都不适合我。
我正在 运行 编写一个 PHP 脚本,我试图在其中使用 LOAD DATA INFILE
像这样
$db = mysqli_init();
mysqli_options($db, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($db, $db_host, $db_username, $db_password, $database);
$sql = "LOAD DATA LOCAL INFILE '" . $tpl_vars['filename'] . "' " .
"INTO TABLE " . $table_name . " " .
"FIELDS TERMINATED BY '" . $tpl_vars['delimiter'] . "' " .
"ENCLOSED BY '\"" . $tpl_vars['encapsulation'] . "' " .
"LINES TERMINATED BY '\n' " .
($tpl_vars['contains_header'] == 1 ? "IGNORE 1 ROWS" : "") . " " .
"(" . $columns . ") " .
$set;
$db->query($sql);
结果语句看起来像这样并且在语法上是正确的。 table 中存在的所有列。
LOAD data local INFILE '/path/to/file/file.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 rows (@category, @title, @price, @description)
SET category = @category, title = @title, price = @price, description = @description;
我得到的结果是
The used command is not allowed with this MariaDB version.
即使我 运行 phpMyAdmin 中的语句也会导致
2000 - LOAD DATA LOCAL INFILE is forbidden, check mysqli.allow_local_infile
因为我没有对我的服务器的完全 root 访问权限,所以我使用 ini_get_all()
检查了我的 php.ini,它返回了
mysqli.allow_local_infile: {global_value: "1", local_value: "1", access: 4}
检查 my.cnf 我 运行 SHOW VARIABLES
我的数据库。它返回
local_infile ON
据我所知,一切都配置得很好 运行 LOAD DATA LOCAL INFILE
。我错过了什么吗?
我的用户确实有以下 GRANTS
GRANT USAGE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD 'asdf'
GRANT ALL PRIVILEGES ON `db`.* TO 'user'@'localhost'
我在 MariaDB 10.1.44 和 PHP 5.5.38.
看来问题是我的用户没有文件授权。
GRANT FILE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD 'asdf'
成功了。