我在Laravel中运行以下准备好的声明时遇到了麻烦:
$pdo = DB::connection()->getPdo();
$ps_TempTable_PushCsv = $pdo->prepare(
"LOAD DATA LOCAL INFILE '123'
INTO TABLE `123`
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\\n'"
);
$ps_TempTable_PushCsv->execute();
$ps_TempTable_PushCsv->closeCursor();
$rowCount = $ps_TempTable_PushCsv->rowCount();
我收到以下错误:
[2017-06-08 03:41:35] local.ERROR:PDOException:SQLSTATE [HY000]:常规错误:2014在其他未缓冲的查询处于活动状态时无法执行查询。考虑使用PDOStatement :: fetchAll()。或者,如果您的代码只是针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。
这是我的控制器的入口点,所以肯定没有先前的查询在运行。
怎么办?
由于
答案 0 :(得分:4)
我能让它发挥作用的唯一方法就是用一个' exec'来替换准备好的声明。拨打:
$rowCount = DB::connection()->getpdo()->exec(
"LOAD DATA LOCAL INFILE '$fileName'
INTO TABLE $tableName
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\\n'"
);
我不知道为什么它不能在Laravel中使用预先准备好的语句 - 它绝对适用于纯PDO准备语句。
答案 1 :(得分:1)
如果继续使用the accepted answer,请确保在创建连接时添加以下代码:
PDO::MYSQL_ATTR_LOCAL_INFILE => true
例如:
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::MYSQL_ATTR_LOCAL_INFILE => true
];
$pdo = new PDO("mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DB, MYSQL_USER, MYSQL_PASSWORD, $options);