首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用准备语句的Zend db并不能获取所有数据

问使用准备语句的Zend db并不能获取所有数据
EN

Stack Overflow用户
提问于 2013-10-23 23:11:42
回答 1查看 1.3K关注 0票数 2

首先是罪状:

代码语言:javascript
复制
$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实例(使用ZendVersion1.10.0)

症状

  • 当我在第二个周期中省略closeCursor时,我已经得到了错误:PHP致命错误:带有消息“SQLSTATEHY000: General : 2014不能执行查询,而其他未缓冲的查询处于活动状态”的非常规异常“PDOException”。请考虑使用PDOStatement::fetchAll()。或者,如果您的代码只对mysql运行,则可以通过设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性启用查询缓冲。
  • 但是我用的是fetchAll!
  • 当我添加closeCursor时,结果不完整。在查询浏览器中调用CALL getData('3872')将返回包含72列的1行。上述代码所做的相同操作只返回1行,其中只有前41列。

我做错什么了?

Edit2:半解

更新代码如下:

代码语言:javascript
复制
$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致命错误:未指明的异常'PDOException‘与消息'SQLSTATEHY000:一般错误 /home/GIT/includes/Zend/Db/Statement/Pdo.php:294中带有消息“SQLSTATEHY000: General”的下一个异常“Zend_Db_Statement_Exception” 在fetchAll的线路上。
  • 使用泛型异常可以捕获此错误。
  • 通过这段代码,我得到了所有的72列。
  • 我感觉到这很糟糕,因为我故意捕获一般的异常,并将其转化为日志。我猜这也将成为一个性能问题(循环运行大约10,000次)。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-23 23:20:19

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

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

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

Zend_Db API是以PDO为模型的,因此您可以看到nextRowset()在PDOStatement::nextRowset()文档中的示例使用情况。

不幸的是,没有像fetchAllRowsets()这样的函数。你可以自己做这件事,就像一个时间循环。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19554014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档