Yii2加载数据本地文件

时间:2018-07-11 13:06:58

标签: php mysql yii2 mysql-workbench load-data-infile

我知道有其他解决方案可以解决此问题,但对我而言不起作用。

我正在尝试通过Yii2网站在MySQL数据库中执行LOAD DATA LOCAL INFILE语句。过去我已经做到了这一点,所以我不确定为什么它不再起作用了。

我收到以下错误:

  

SQLSTATE [42000]:语法错误或访问冲突:1148   此MySQL版本不允许使用该命令

我的db.php配置文件中确实有以下设置。

'attributes' => [ PDO::MYSQL_ATTR_LOCAL_INFILE => true ],

我也尝试禁用secure-file-priv无济于事。

编辑

我尝试从Workbench运行以下查询,它也通过Workbench引发错误。但是,它适用于MySQL 5.7。我目前正在使用8.0

LOAD DATA LOCAL INFILE 'D:/Temp/6_attlog.dat' IGNORE
INTO TABLE att_log
FIELDS TERMINATED BY '\t' ENCLOSED BY '''' LINES TERMINATED BY '\r\n' IGNORE 0 LINES 
(@id, `date_time`, `dev_id`, `mode`, `work_code`, `work_code1`) SET `id` = TRIM(@id)

编辑2

我知道它可以与“ LOAD DATA INFILE”一起使用...

...但不适用于“ LOAD DATA 本地 INFILE”

这是我使用的代码...

$inFile = str_replace('\\', '/', realpath('uploads/'.$model->file->name));
Yii::$app->db->createCommand('
    LOAD DATA LOCAL 
    INFILE \''.$inFile.'\' IGNORE 
    INTO TABLE att_log 
    FIELDS TERMINATED BY \'\\t\'  
    ENCLOSED BY \'\'\'\' 
    LINES TERMINATED BY \'\r\n\' 
    IGNORE 0 LINES 
    (@id, `date_time`, `dev_id`, `mode`, `work_code`, `work_code1`) 
    SET `id` = TRIM(@id)
')->execute();
unlink($inFile);

2 个答案:

答案 0 :(得分:0)

只是一个建议

在PHP中,您可以使用单引号和双引号,因此可以以更简单的方式构建命令,例如:

  $inFile = str_replace('\\', '/', realpath('uploads/'.$model->file->name));
  Yii::$app->db->createCommand("
      LOAD DATA LOCAL 
      INFILE '".$inFile."' IGNORE 
      INTO TABLE att_log 
      FIELDS TERMINATED BY '\t'  
      ENCLOSED BY '\' 
      LINES TERMINATED BY '\r\n\' 
      IGNORE 0 LINES 
      (@id, `date_time`, `dev_id`, `mode`, `work_code`, `work_code1`) 
      SET `id` = TRIM(@id)
  ")->execute();
  unlink($inFile);

答案 1 :(得分:0)

根据MySQL文档,服务器需要配置为允许LOCAL关键字:

  

LOCAL仅在服务器和客户端都已配置为允许时才有效。例如,如果mysqld是在禁用local_infile系统变量的情况下启动的,则LOCAL不起作用。

https://dev.mysql.com/doc/refman/8.0/en/load-data.html

您确定服务器已正确配置为允许该关键字吗?