[英]PDOStatement::nextRowset() not working with dblib and MSSQL
[英]PDO dblib nextRowset not working
我正在将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中遇到了同样的问题。
有没有人有任何想法为什么会发生这种情况以及我如何解决它?
您是使用PDO::fetch
还是PDO::fetchAll
获取数据? 因为如果你使用“fetch”方法并且没有到达行的末尾PDO::nextRowset()
将失败(我不知道为什么,它只是发生在我身上)。
因此,对于我来说, 强制扫描所有行 直到PDO::fetch
返回false ,然后PDO::nextRowset()
将正常执行。
这意味着如果行集中只有一行,则必须至少调用两次PDO::fetch
(1表示检索数据,1表示返回false),然后传递给下一行集。
我与PDO::nextRowset()
有同样的问题,因为它返回true,即使没有更多的行集可用,因此在调用fetchAll()
,它会引发异常HY000
。
你可以通过在获取rowset之前用方法PDO::columnCount()
检查列数来遵循一个简单的技巧。 如果它不为零,则您有一个有效的行集,因此您可以调用PDO::fetchAll()
。
即使PDO::nextRowset()
报告为true, columnCount()
也会在移动到下一个rowset之前报告列数。
while ($pdo->columnCount()) {
$data[] = $pdo->fetchAll(PDO::FETCH_ASSOC); //or, $pdo->fetchAll()
$pdo->nextRowset();
}
此外,建议在try块中进行所有PDO操作,否则可能会出现未处理的异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.