首页 文章

Yii2 LOAD DATA LOCAL INFILE

提问于
浏览
0

我知道这个问题有其他解决办法,但它对我不起作用 .

我试图通过Yii2网站在MySQL数据库中执行LOAD DATA LOCAL INFILE语句 . 我过去有这个工作,所以我不确定为什么它不再起作用了 .

我收到以下错误:

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

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

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

我也试过禁用secure-file-priv无济于事 .

EDIT

我尝试从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 LOCAL 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

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

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

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

    您确定您的服务器配置正确以允许此关键字吗?

  • 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);
    

相关问题