繁体   English   中英

db2_num_rows() 返回 -1

[英]db2_num_rows() returns -1

我有一个使用今天早些时候工作的分页的查询,但现在返回获取失败。 我检查了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));
            }
        }

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

PHP文档说:

返回由 SQL 语句删除、插入或更新的行数。

它还说:

要确定 SELECT 语句将返回的行数,请使用与预期 SELECT 语句相同的谓词发出 SELECT COUNT(*) 并检索值。

总结

我同意,奇怪的是 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)它也有非常好的性能,因为您计算缓存中先前执行的语句的行数肯定...

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM