Php 错误1148 MySQL此MySQL版本不允许使用此命令

Php 错误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

我正在使用MySQL
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
解决方案:

  • 在mysql命令行上使用
    --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
    
  • 或者将参数发送到mysql守护程序:

    mysqld --local-infile=1
    
  • 或者将其设置在my.cnf文件中(这是一种安全风险):

    找到您的mysql
    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