PDO dblib nextRowset 不工作

PDO dblib nextRowset not working

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

它利用 PDO 运行 针对 Microsoft SQL 服务器数据库的存储过程。

所以,我已经安装并配置了PHP5.6.22、Apache、freetds和pdo dblib以方便应用。

大多数存储过程执行都运行良好。 return 多个行集除外。

当我调用 $pdo->nextRowset() 时,我得到了这个致命错误:

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

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

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

有人知道为什么会这样吗?我该如何解决?

我遇到了与 PDO::nextRowset() 相同的问题,因为它 returns 即使没有更多可用的行集也是如此,因此当调用 fetchAll() 时,它会引发异常 HY000

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

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

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

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

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

所以,对我来说 强制扫描所有行 直到 PDO::fetch returns false,那么PDO::nextRowset()会正常执行。

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