Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询
Posted
技术标签:
【中文标题】Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询【英文标题】:Laravel - PDO Prepared Statement - Cannot execute queries while other unbuffered queries are active 【发布时间】:2017-11-09 15:07:58 【问题描述】:我在 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]: General error: 2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。
这是我的控制器的入口点,所以肯定没有运行之前的查询。
做什么?
谢谢
【问题讨论】:
【参考方案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);
【讨论】:
【参考方案2】:我可以让它工作的唯一方法是用'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 准备好的语句。
【讨论】:
你真的应该避免抓住 PDO 句柄,而是使用像DB::insert
这样的东西来处理原始查询。
一种方法是尝试一下。据我所知,这些处理程序非常通用。
@tadman 对于它的价值,DB::insert
在这种情况下似乎对我不起作用。不过感谢您的建议!
PDO::exec(): LOAD DATA LOCAL INFILE 禁止以上是关于Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询的主要内容,如果未能解决你的问题,请参考以下文章
PDO Prepared Statement 允许执行 javascript
PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句