2016-08-01 10 views
1

Ich habe eine Abfrage, die Seitennummerierung verwendet, die früher gearbeitet hat, aber jetzt einen Abruffehler zurückgibt. Ich habe die db2_num_rows() überprüft und es gibt mir -1. Wenn ich die PHP-Dokumentation überprüfe, sollte db2_num_rows() niemals einen negativen Wert zurückgeben; es sollte immer einen positiven Wert oder false zurückgeben.db2_num_rows() gibt -1 zurück

Hat jemand eine Idee, welche Bedingung es -1 zurückgeben würde? Da db2_stmt_error() und db2_stmt_errorMsg() beide leere Zeichenfolge zurückgeben, hoffe ich, dass dies mir helfen würde, die Ursache meines Problems zu beheben.

Hier ist eine verkürzte Version meines Skripts. Die Abfrage selbst funktioniert ordnungsgemäß, wenn ich mit der AS400-Konsole mit strsql testen.

 $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)); 
      } 
     } 

Antwort

1

Sie versuchen db2_num_rows zu verwenden Anzahl der Zeilen gefunden zu bestimmen. Sie führen diese Funktion nach der Ausführung von select aus.

PHP documentation sagt:

Gibt die Anzahl der Zeilen gelöscht, eingefügt oder aktualisiert durch eine SQL-Anweisung .

Er sagt auch:

Um die Anzahl der Zeilen zu bestimmen, die von einer SELECT Anweisung zurückgegeben werden, ausgeben SELECT COUNT (*) mit den gleichen Prädikaten wie Ihre SELECT-Anweisung bestimmt und abrufen der Wert.

Zusammenfassung

Ich bin damit einverstanden, ist es seltsam, dass PHP-Dokumentation nichts über negativen Wert sagt. Aber es besagt, dass Sie diese Funktion nicht verwenden können, um Anzahl der Zeilen zu bestimmen, die von Ihrer select-Abfrage gefunden werden. Ein Fehler ist ein typischer Verwendungsfehler.

+0

Ok, danke. Nach all den anderen DBMS, die ich im Laufe der Jahre verwendet habe, bin ich immer wieder erstaunt über die Dummheit von IBM, dass ich die Anzahl der von einer Abfrage zurückgegebenen Zeilen nicht ohne eine separate Abfrage abrufen kann (was das Risiko einführt) eines anderen Fehlers in der COUNT() - Abfrage). –

Verwandte Themen