db2_num_rows() returns -1

db2_num_rows() returns -1

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

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

这是我的脚本的简化版本。当我使用 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));
            }
        }

您正在尝试使用 db2_num_rows 来确定找到的行数。 你运行这个函数执行完select.

PHP documentation 说:

Returns the number of rows deleted, inserted, or updated by an SQL statement.

它还说:

To determine the number of rows that will be returned by a SELECT statement, issue SELECT COUNT(*) with the same predicates as your intended SELECT statement and retrieve the value.

总结

我同意,奇怪的是 PHP 文档只字不提负值。 但它表示您不能使用此函数来确定 select 查询找到的行数。你的错误是典型的使用错误。

我可以确认...任何 "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"-part...:-) #paging) 它还具有非常好的性能,因为您可以计算缓存中肯定存在的先前执行的语句的行...

此致