db2_num_rows()返回-1

时间:2016-08-01 19:40:06

标签: php db2 db2-400

我有一个使用今天早些时候工作的分页的查询,但现在返回一个获取失败。我检查了db2_num_rows(),它给了我-1。当我检查PHP文档时,db2_num_rows()永远不会返回负值;它应该始终返回正值或false

有没有人知道什么条件会导致它返回-1?由于db2_stmt_error()db2_stmt_errorMsg()都返回空字符串,我希望这可以帮助我解决问题的根本原因。

这是我的脚本的缩短版本。当我使用strsql使用AS400控制台进行测试时,查询本身可以正常工作。

        $minRow = 1;
        $maxRow = 14;
        $sql = 'SELECT * '
            . 'FROM ('
            . 'SELECT row_number() OVER (ORDER BY FETYPE) AS ID, '
            . 'FETYPE, FECNO, FELC, FEID, FEDESC, FEBLEND, FECALC, '
            . 'CAST(FECOST AS VARCHAR(12)) AS FECOST, '
            . 'CAST(FEMARK AS VARCHAR(12)) AS FEMARK, '
            . 'FEMKTP, '
            . 'CAST(FESRNK AS VARCHAR(12)) AS FESRNK, '
            . 'FEBSIZ, FEUDT, FEUTM, '
            . 'FEMDT, FEUSID, FEINS1, FEMIXINS1, FEMIXINS2, FEMIXINS3, '
            . 'FEVER, FEIMDT, FEANIMAL, '
            . 'CAST(FERATE AS VARCHAR(7)) AS FERATE, '
            . 'FETLA1, FETLA2, FETLA3, '
            . 'FETLA4, FETLA5, FETLA6, FETLA7, FETLA8, FETLA9, FETLA10, '
            . 'FESLNO, FESORV, FECMCD, FEMULTI, FEBRILLDT, FEFLUSH, '
            . 'FEFLUSHQTY, '
            . 'CAST(FECFEE AS VARCHAR(12)) AS FECFEE, '
            . 'FECFTP, FEFILL, FEMIXTIME, FEPURPOSE, FEMEDS, '
            . 'FEMEDTXT, FEDIRECT, FEMORTXT '
            . 'FROM UFFRATH ' . $this->whereClause
            . ') AS P '
            . 'WHERE P.ID BETWEEN ? AND ?';
        db2_bind_param($stmt, 1, 'minRow', DB2_PARAM_IN);
        db2_bind_param($stmt, 2, 'maxRow', DB2_PARAM_IN);
        $exec = db2_execute($stmt);

        if ($exec) {
            $this->log('num_rows = '. db2_num_rows($stmt), true); // writes 'num_rows = -1' to the log file
            while ($row = db2_fetch_object($stmt)) { // throws db2_fetch_object(): Fetch Failure
                array_push($data, $this->buildRation($row));
            }
        }

2 个答案:

答案 0 :(得分:1)

您正尝试使用db2_num_rows来确定找到的行数。 执行select后运行此函数。

PHP documentation说:

  

返回SQL删除,插入或更新的行数   言。

它还说:

  

确定SELECT将返回的行数   声明,发出SELECT COUNT(*),其谓词与您的谓词相同   预期的SELECT语句并检索值。

<强>摘要

我同意,奇怪的是PHP文档没有说明负面价值。 但它表示您无法使用此函数来确定select查询找到的行数。你错了是一个典型的使用错误。

答案 1 :(得分:0)

我可以确认...任何“ num_rows”功能在IBM-i-db2上均不起作用(无论是odbc还是本机db2)。

您必须执行单独的“ SELECT COUNT(*)FROM ...”语句...

最简单的解决方案是根据您的情况将原始SQL语句包装到WITH子句中:

list($count) = db2_fetch_array(db2_execute("WITH X AS(".$stmt.") SELECT COUNT(*) FROM X"));

因此您可以重用您的SQL语句...

(只要它没有“ FETCH FIRST?ROWS ONLY”部分::-) #paging) 它的性能也非常好,因为您可以肯定缓存中先前执行的语句的行数。

致谢