Php 错误1148 MySQL此MySQL版本不允许使用此命令
我正在使用MySQLPhp 错误1148 MySQL此MySQL版本不允许使用此命令,php,mysql,load-data-infile,Php,Mysql,Load Data Infile,我正在使用MySQLLOAD DATA LOCAL infle命令,我得到以下错误: PDOException: SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version: LOAD DATA LOCAL INFILE '/tmp/phpI0ox54' INTO TABLE `dev_tmp` FIELDS TERMINATED
LOAD DATA LOCAL infle
命令,我得到以下错误:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1148 The used
command is not allowed with this MySQL version: LOAD DATA LOCAL INFILE
'/tmp/phpI0ox54' INTO TABLE `dev_tmp` FIELDS TERMINATED BY ',' ENCLOSED
BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; Array ( ) in
dc_real_estate_form_submit() (line 147 of /PATH/TO/PHP/SCRIPT).
ERROR 1148 (42000): The used command is not allowed with this MySQL version
我们可以更改什么设置以允许加载数据本地填充
下面是我们正在使用的Drupal 7代码:
$sql = "LOAD DATA LOCAL INFILE '".$file."'
INTO TABLE `dev_tmp`
FIELDS
TERMINATED BY ','
ENCLOSED BY '\"'
LINES
TERMINATED BY '\\r\\n'
IGNORE 1 LINES";
db_query($sql);
在MySQL中加载本地文件是一种安全隐患,默认情况下是关闭的,如果可以,您希望将其关闭。如果不允许,则会出现以下错误:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1148 The used
command is not allowed with this MySQL version: LOAD DATA LOCAL INFILE
'/tmp/phpI0ox54' INTO TABLE `dev_tmp` FIELDS TERMINATED BY ',' ENCLOSED
BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; Array ( ) in
dc_real_estate_form_submit() (line 147 of /PATH/TO/PHP/SCRIPT).
ERROR 1148 (42000): The used command is not allowed with this MySQL version
解决方案:
--local infle=1
参数:
当您在终端上启动MySQL时,包括--local infle=1
参数,如下所示:
mysql --local-infile=1 -uroot -p
mysql>LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo
COLUMNS TERMINATED BY '\t';
然后该命令被允许:
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysqld --local-infile=1
my.cnf
文件,并将其作为root用户进行编辑
在mysqld和mysql指示符下添加local infle
行:
[mysqld]
local-infile
[mysql]
local-infile
保存文件,重新启动mysql。再试一次更多信息可以在这里找到:除了在MySQL服务器上使用
本地infle
(您也可以将其放入/etc/my.cnf文件中),您还需要启用PDO以允许它:
<?php
$pdo = new PDO($dsn, $user, $password,
array(PDO::MYSQL_ATTR_LOCAL_INFILE => true)
);
旧版mysql\u connect还有一个参数“client\u flag
”,可用于设置mysql参数
client_flags参数可以是以下各项的组合
常量:128(启用加载数据本地处理)、MYSQL\u客户端\u SSL、,
MYSQL\u客户端\u压缩、MYSQL\u客户端\u忽略\u空间或
MYSQL\u客户端\u交互。阅读有关MySQL客户端的部分
常数以获取更多信息。在SQL安全模式下,此参数为
忽略。
例如:
$db = mysql_connect($host, $user, $pass, FALSE, 128);
但是,您也可能会遇到以下错误:
ERROR 29 (HY000): File '/var/www/.../mysql_import.csv' not found (Errcode: 13)
在这种情况下,您可能需要检查应用程序护甲设置,以允许MySQL访问文件系统上的导入文件
我特别补充说:
/import/ r,
/import/* rw,
为MySQL提供对/import的读/写访问权限
例如:示例应用程序装甲配置文件
cat /etc/apparmor.d/usr.sbin.mysqld
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>
/usr/sbin/mysqld {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>
#include <abstractions/mysql>
#include <abstractions/winbind>
capability dac_override,
capability sys_resource,
capability setgid,
capability setuid,
network tcp,
/etc/hosts.allow r,
/etc/hosts.deny r,
/etc/mysql/*.pem r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/*.cnf r,
/usr/lib/mysql/plugin/ r,
/usr/lib/mysql/plugin/*.so* mr,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/log/mysql.log rw,
/var/log/mysql.err rw,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
/run/mysqld/mysqld.pid w,
/run/mysqld/mysqld.sock w,
# Custom import folders start
# These folders will also be read/writeable by mysql.
/import/ r,
/import/* rw,
# Custom import folders end
/sys/devices/system/cpu/ r,
# Site-specific additions and overrides. See local/README for details.
#include <local/usr.sbin.mysqld>
}
cat/etc/apparmor.d/usr.sbin.mysqld
#vim:syntax=apparmor
#最后修改:2007年6月19日星期二17:37:30
#包括
/usr/sbin/mysqld{
#包括
#包括
#包括
#包括
#包括
能力dac_覆盖,
能力系统资源,
能力集,
能力setuid,
网络tcp,
/etc/hosts.r,
/etc/hosts.r,
/etc/mysql/*.pem r,
/etc/mysql/conf.d/r,
/etc/mysql/conf.d/*r,
/etc/mysql/*.cnf r,
/usr/lib/mysql/plugin/r,
/usr/lib/mysql/plugin/*.so*mr,
/usr/sbin/mysqld先生,
/usr/share/mysql/**r,
/var/log/mysql.log rw,
/var/log/mysql.err rw,
/var/lib/mysql/r,
/var/lib/mysql/**rwk,
/var/log/mysql/r,
/var/log/mysql/*rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
/运行/mysqld/mysqld.pid w,
/运行/mysqld/mysqld.sock w,
#自定义导入文件夹开始
#mysql还可以读取/写入这些文件夹。
/进口/转口,
/导入/*rw,
#自定义导入文件夹结束
/sys/devices/system/cpu/r,
#站点特定的添加和覆盖。有关详细信息,请参阅本地/自述。
#包括
}
之后,MySQL可以从/import
目录中读取文件。我们使用LOCAL关键字的主要原因是
MySQL手册对此进行了解释:
另一方面,您不需要文件特权来加载本地文件
档案
因此,如果您确实具有对服务器的文件访问权限,请尝试在SQL查询中跳过使用“LOCAL”一词,而是将文件复制到服务器和目录mysql/data/[tablename]
有关此本地/非本地的详细信息,请参见:
您不必再担心更改/etc/mysql/my.cnf只需按照以下过程解决问题:
使用命令行登录mysql
mysql-u根-p
检查本地填充状态:
显示“局部填充”之类的变量
如果输出关闭,请运行以下命令:
设置全局局部填充=1
再次检查状态:
显示“局部填充”之类的变量
输出将是:
最后重新启动mysql:
服务mysql重启
现在需要一段时间的新权限,也许这就是问题所在?在调用mysql时添加--local infle。它起作用了。例如:mysql-h localhost——localinfle