php - 带有预准备语句的 Zend db 无法获取所有数据

标签 php mysql prepared-statement zend-db

首先是有罪代码:

$preparedGetData = $db->prepare("CALL getData(?)");
foreach($userSet as $r) {
    $preparedGetData->execute(array($r['id_user']));
    $rs = $preparedGetData->fetchAll();
    $preparedGetData->closeCursor();
}

说明

getData = mysql 中的存储过程
$db = Zend_Db_Adapter_Pdo_Mysql 实例(使用 Zend 版本 1.10.0 )

症状

  • 当我在第二个周期中省略 closeCursor 时,我已经收到错误:

    PHP fatal error :未捕获异常“PDOException”,消息为“SQLSTATE[HY000]:一般错误:2014 当其他未缓冲查询处于事件状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码仅针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。

  • 但是我正在使用fetchAll!!!

  • 当我添加 closeCursor 时,结果到达不完整。在查询浏览器中调用 CALL getData('3872') 返回 1 行 72 列。上面的代码执行相同的操作会返回 1 行,仅包含前 41 列。

我做错了什么?

编辑2:半解决方案

代码更新为:

$preparedGetData = $db->prepare("CALL getData(?)");
foreach($userSet as $r) {
    $preparedGetData->execute(array($r['id_user']));

    $rs=array();

    do {
        try {
            $partial_rowset = $preparedGetData->fetchAll(); // When I put fetchAll() after the end of the cycle, I get empty resultset.
        } catch (PDOException $error) { // The PDOException doesn't get caught here. Why?
            error_log($error);
        } catch (Exception $error) { 
            error_log($error);
        }
        if ($partial_rowset) {
            $rs=array_merge($rs,$partial_rowset);
        }
    } while ($preparedGetData->nextRowset());
}

症状

  • 出现错误:
    PHP fatal error :未捕获异常“PDOException”,消息为“SQLSTATE[HY000]:一般错误
    /home/GIT/includes/Zend/Db/Statement/Pdo.php:294
    中出现下一个异常“Zend_Db_Statement_Exception”,消息为“SQLSTATE[HY000]:一般错误” 与 fetchAll 上线。
  • 我可以使用通用异常捕获此错误。
  • 使用此代码我可以获得全部 72 列。
  • 我认为这很令人讨厌,因为我故意捕获通用异常并将其转换为日志。我猜这也会成为一个性能问题(循环运行大约 10 000 次)。

最佳答案

MySQL 存储过程可能有多个结果集。也就是说,您可以在存储过程中运行多个 SELECT 查询,然后迭代这些多个结果集。

这使获取变得复杂,因为整个结果实际上就像一个数组的数组的数组(多个结果集,每个结果集可能有多行,每行可能有多列)。

但是fetchAll()仅从一个结果集中获取所有行。因此,当您调用存储过程时,您需要强制它刷新所有结果集。也就是说,继续调用 nextRowset() 直到该函数返回 null。

Zend_Db API 是根据 PDO 建模的,因此您可以在 PDOStatement::nextRowset() 的文档中查看 nextRowset() 的示例用法.

不幸的是,没有像 fetchAllRowsets() 这样的函数。您需要自己以 while 循环的方式完成此操作。

关于php - 带有预准备语句的 Zend db 无法获取所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19554014/

相关文章:

MySQL 存储过程 echo "rows affected"而不是所需的结果?

java - 批量执行失败后,如何重试未执行的语句?

php - PDO准备语句问题

php - fatal error : Call to a member function result() on string when building a PHP filtering system

php - 用户点击弹出窗口上的保存按钮刷新主窗口

php - 如何在 php 中列出所有国家及其州/省?

mysql - 使用通配符跨两列查找 MySQL 近重复项

php - 使用 SFTP 和 cURL 获取文件

java - intellij idea 添加 mysql 连接器到项目库

mysql - = :user_receiver do in this sql query? 是什么意思