PDO dblib nextRowset无法正常工作

时间:2016-06-24 11:56:33

标签: php sql-server pdo centos freetds

我正在将PHP应用程序从在Windows环境中运行转换为基于Linux的环境。

它利用PDO针对Microsoft SQL Server数据库运行存储过程。

因此,我已经安装并配置了PHP 5.6.22,Apache,freetds和pdo dblib以方便应用程序。

大多数存储过程执行都很完美。除了返回多个行集的那些。

当我致电$pdo->nextRowset()时,我收到了致命错误:

SQLSTATE[HY000]: General error: PDO_DBLIB: dbresults() returned FAIL

我能找到的唯一参考是PHP 5.6.9中报告的错误已修复。

但是,我在PHP 5.6.22中遇到了同样的问题。

有没有人知道为什么会这样,以及我如何解决它?

2 个答案:

答案 0 :(得分:4)

您是使用PDO::fetch还是PDO::fetchAll获取数据?因为如果你使用" fetch"方法并没有到达行PDO::nextRowset()的末尾将失败(我不知道为什么,它只是发生在我身上)。

因此,对于我来说强制扫描所有行 直到PDO::fetch返回false ,然后PDO::nextRowset()将正常执行。

这意味着如果行集中只有一行,则必须至少调用PDO::fetch两次(1表示检索数据,1表示返回false),然后传递给下一行集。

答案 1 :(得分:1)

我遇到PDO::nextRowset()同样的问题,因为即使没有更多的行集可用,它也会返回true,因此在调用fetchAll()时会引发异常HY000

您可以通过使用方法检查列数来遵循一个简单的技巧 获取行集之前PDO::columnCount()。如果它不为零,则表示您拥有有效的行集,因此可以调用PDO::fetchAll()

即使PDO::nextRowset()报告为真,columnCount()也会在移至下一行集之前报告列数。

while ($pdo->columnCount()) {
    $data[] = $pdo->fetchAll(PDO::FETCH_ASSOC); //or, $pdo->fetchAll() 
    $pdo->nextRowset();
}

此外,建议在try块中进行所有PDO操作,否则可能会出现未处理的异常。