2016-08-01 159 views
1

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

有没有人有一个想法会导致它返回-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)); 
      } 
     } 

回答

1

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

PHP documentation说:

返回删除,插入或更新一个SQL语句 的行数。

它还说:

要确定将由一个SELECT 语句返回的行数,使用相同的谓词为您 预期的SELECT语句执行SELECT COUNT(*)和检索价值。

摘要

我同意,这是不可思议的是PHP文件只字未提负值。 但它表示您不能使用此函数来确定您的select查询找到的行数。你错误是一个典型的使用错误。

+0

好的,谢谢。在我多年来使用的所有其他数据库管理系统之后,我从不会为IBM的愚蠢感到惊讶,因此我无法检索查询返回的行数而无需执行单独的查询(这会引入风险该COUNT()查询中的另一个错误)。 –