php - Yii2 加载数据本地文件
问题描述
我知道这个问题还有其他解决方案,但它对我不起作用。
我正在尝试通过 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
我让它与“加载数据输入文件”一起工作......
...但它不适用于“加载数据本地文件”
这是我使用的代码...
$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);
解决方案
只是一个建议
在 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);
推荐阅读
- python-3.x - 如何创建 rtp 音频的 raw?
- android - JDBC 到 android.sqlite:SELECT/DELETE ... WHERE field IN (?)
- java - 为什么不使用无限运行的while循环就不能画线
- node.js - 如何在 Node.js 中使用 Nodemailer 发送邮件
- ember.js - 克隆磁盘后出现 ember 应用程序问题
- bash - 读取在 bash 中截断的属性文件值
- php - 电子邮件列表的订阅者没有收到回复电子邮件
- javascript - OnDoubleClick 反应
- typescript - ReturnType 助手中的打字稿类型推断
- sql - 如何根据表 b 中的行数读取表 a 的前 n 行?