PDO dblib nextRowset 不工作
Posted
技术标签:
【中文标题】PDO dblib nextRowset 不工作【英文标题】:PDO dblib nextRowset not working 【发布时间】:2016-10-27 01:02:27 【问题描述】:我正在将 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 中遇到了同样的问题。
有没有人知道为什么会发生这种情况以及我该如何解决?
【问题讨论】:
您能否通过调整php.ini
中关于错误详细程度的设置来返回比失败更详细的错误(对不起,多年来没有接触过PHP,或者我会更具体)。如果我们可以让实际的 FreeTDS 错误浮出水面,那将更容易诊断,因为您可能会将 Windows 上的 SQL Server 驱动程序换成 Linux 上的 FreeTDS。
PHP 的详细程度最高,仅在我的问题中显示错误消息。
刚刚检查,您是否通过 fetchall 运行了该过程?
@Ctc 我只对每个行集使用fetch()
,因为它每个行集只返回 1 行。
@Jamesking56 能否请您发布执行并获取结果的代码。
【参考方案1】:
PDO::nextRowset()
有同样的问题,因为即使没有更多可用的行集它也会返回 true,因此在调用 fetchAll()
时,它会引发异常 HY000
。
您可以通过使用方法检查列数来遵循一个简单的技巧
PDO::columnCount()
在获取行集之前。如果它不为零,则您有一个有效的行集,因此您可以调用PDO::fetchAll()
。
即使 PDO::nextRowset()
报告为 true,columnCount()
也会在移动到下一个行集之前报告列数。
while ($pdo->columnCount())
$data[] = $pdo->fetchAll(PDO::FETCH_ASSOC); //or, $pdo->fetchAll()
$pdo->nextRowset();
另外,建议所有 PDO 操作都在 try 块内进行,否则可能会出现未处理的异常。
【讨论】:
【参考方案2】:您是使用PDO::fetch
还是PDO::fetchAll
获取数据?因为如果你使用“fetch”方法并且没有到达行尾PDO::nextRowset()
将会失败(我不知道为什么,它只是发生在我身上)。
所以,对我来说,强制扫描所有行 直到PDO::fetch
返回false,然后PDO::nextRowset()
将正常执行。
这意味着如果行集中只有一行,则必须调用PDO::fetch
至少两次(1 次用于检索数据,1 次返回 false)然后传递到下一个行集。
【讨论】:
如果这种垃圾行为被记录在某处就好了,比如在 PDO::nextRowset() 的手册页上。 是的,那会非常好......我在这种行为上花了几个小时,直到我发现这个“问题”(或功能......)以上是关于PDO dblib nextRowset 不工作的主要内容,如果未能解决你的问题,请参考以下文章
使用 PDO_DBLIB 连接到 MS SQL 数据库的 PHP 错误