当使用php从Debian容器调用db2存储过程到IBMi服务器时,无法获得下一个结果集



我正试图使用php(ibm_db2 v2.0.2扩展(将db2存储过程从我的Debian容器调用到IBMi服务器。

我已经在Debian容器(docker(上安装了ibm_db2(v2.0.2(php扩展,以通过TCP/IP协议对IBMi服务器上托管的db2数据库进行请求,它运行良好,我可以正确地进行查询。

当我尝试调用具有多个结果集的存储过程时,就会出现问题。当我调用存储过程时,我可以使用db2_fetch_assoc函数获得第一个结果集,但不能使用db2_next_result函数获得下一个结果集。没有抛出错误,db2_fetch_assoc只是对下一个结果集返回false,就好像没有后续的结果集一样。

调用这些存储过程的应用程序部署在IBMi上的ZendServer上,一切都很正常。这个问题出现在我的"码头工人"环境中。我尝试了很多事情,比如更改ibm_db2扩展的版本,尝试另一个ODBC驱动程序版本,更改php配置,但我无法使其正常工作。

奇怪的是,当我从docker中使用db2cli运行存储过程时,我能够正确地获得所有结果集。它只是不适用于php。

来寻求帮助。有人遇到同样的问题吗?

非常感谢

编辑03/18/2020

db2_client_info php函数中的驱动程序信息

这是我检索结果集的代码:

while ($row = db2_fetch_assoc($statement)) {
print_r($row);
}
while ($row = db2_fetch_assoc(db2_next_result($statement))) {
print_r($row);
}
while ($row = db2_fetch_assoc(db2_next_result($statement))) {
print_r($row);
}

编辑:2020年3月18日10:50

php版本为7.1

代码现在看起来如下:

try {
db2_execute($statement);
while ($row = db2_fetch_assoc($statement)) {
print_r($row);
}
$nextResults = db2_next_result($statement);
while ($row = db2_fetch_assoc($nextResults)) {
print_r($row);
}
$nextResults = db2_next_result($statement);
while ($row = db2_fetch_assoc($nextResults)) {
print_r($row);
}      
} catch (Exception $e) {
echo $e->getMessage();
}

根据注释线程,症状是由错误的编码引起的。

为了使db2_fetch_*调用工作,前面的db2_next_result必须返回一个结果集,并且必须对此进行测试。

在原始代码中,由于db2_next_result没有返回结果集,因此使用无效参数无条件调用db2_fetch_assoc

根据IBM示例和PHP文档中的代码,在对.调用任何获取操作之前,有必要测试db2_next_result的结果

CLI跟踪显示了一个函数序列错误,这告诉您在错误的情况下调用了该函数。

最新更新