[英]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.