我正在将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中遇到了同样的问题。
有没有人知道为什么会这样,以及我如何解决它?
答案 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操作,否则可能会出现未处理的异常。