我有一个使用今天早些时候工作的分页的查询,但现在返回一个获取失败。我检查了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));
}
}
答案 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) 它的性能也非常好,因为您可以肯定缓存中先前执行的语句的行数。
致谢