代码之家  ›  专栏  ›  技术社区  ›  Shahid Thaika

yii2加载数据局部填充

  •  0
  • Shahid Thaika  · 技术社区  · 6 年前

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

    我试图通过yii2网站在mysql数据库中执行一个loaddatalocalinfile语句。我以前也有过这样的工作,所以我不知道为什么它不再工作了。

    我得到以下错误:

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

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

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

    我还尝试禁用安全文件特权,但没有成功。

    编辑

    我试着从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

    我让它和“加载数据填充”一起工作…

    …但它不适用于“加载数据” 本地的 填充”

    这是我使用的代码…

    $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 回复  |  直到 6 年前
        1
  •  0
  •   rob006    6 年前

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

    本地的 仅当服务器和客户端都配置为允许时才有效。例如,如果mysqld是以 local_infile 系统变量已禁用, 本地的 不起作用。

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

    您确定您的服务器已正确配置为允许使用此关键字吗?

        2
  •  0
  •   ScaisEdge    6 年前

    只是个建议

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