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 不工作的主要内容,如果未能解决你的问题,请参考以下文章

MAMP Pro 和 PDO-dblib

使用 PDO_DBLIB 连接到 MS SQL 数据库的 PHP 错误

centos 6.x 上的 pdo dblib

PDO dblib 无法将 ip 地址作为“主机”参数连接

LinUX系统ThinkPHP5链接MsSQL数据库的pdo_dblib扩展

php 无法连接到 sql server 2008(使用 pdo dblib)