db2_connect()返回资源ID,尽管失败

时间:2015-09-24 13:35:28

标签: php db2-400 db2-connect ibm-db2

我使用PHP脚本中的ibm_db2驱动程序在AS / 400 V7R2上运行。

我注意到如果我使用db2_connect()选项将无效的库列表传递给i5_libl,其余的连接字符串有效,尽管{{ {1}}。此外,ini_set("display_errors", 1);db2_conn_error()不包含任何内容。另一方面,当我提供有效的库列表时,我的db2_conn_errormsg()语句会以相同的方式进行评估,唯一的区别是错误不会被IF输出到屏幕

我意识到,由于库列表无效而不是失败,而是使用提供的DB用户名的默认库列表进行连接。这对我来说可能很可怕,因为如果由于某种原因我的库列表无效,它将默认为错误的列表(主要关注的是开发和生产环境的混合)。

其他人可以重现这种行为吗?我不知道这是否只是我的系统,我需要一个PTF,或者这是否是典型的。如何使用预期的选项验证DB2连接是否已建立?

要重现的代码(相应地替换系统名称,用户名和密码):

ini_set("display_errors", 1);

1 个答案:

答案 0 :(得分:0)

我最终用Zend开了一张票,结果证明这是预期的行为。

我们知道i5_libl选项会根据http://php.net/manual/en/function.db2-connect.php调用qsys2/qcmdexc('cmd',cmdlen)。但逻辑上必须建立连接,以便它知道哪个QSQSRVR作业要更改库列表。它不是在失败时关闭连接,而是发出警告,db_conn_error()db2_connerrormsg()正常报告所有内容。

幸运的是,它注册为语句错误,可以通过以下方式检测到:

if (db2_stmt_error()) {
    echo "error ID: " . (db2_stmt_error());
    echo "<br>error message: " . (db2_stmt_errormsg());
}

我建议Zend关闭连接或强制连接错误或其他什么。我想不出任何我希望连接到数据库的实例,除了我指定的库列表之外没有任何警告或公然通知。如果开发和生产数据相互交织,这可能会导致灾难。