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

PDO Prepared在单个查询中插入多行

PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句

PDO vs MYSQLI,Prepared Statemens 和绑定参数

MySQL Prepared PDO 语句正在删除反斜杠

如何在SELECT FROM PDO Prepared Statement中为搜索框设置多个搜索条件?