2016-05-26 28 views
1

Ich möchte meinen Webserver auf die neueste Ubuntu-Version upgraden und somit auch php5 auf php7 aufrüsten. Ich habe die Installation und Konfiguration einer VM mit lubuntu 16.04 abgeschlossen, um Dinge zu testen, um zu sehen, ob Code-Änderungen erforderlich sind, und um zu testen, ob es überhaupt funktioniert.oci8 (Oracle) Probleme nach der Migration zu php7

In der ersten Anwendung habe ich ein seltsames Problem mit Orakel (Oci8). Die Anwendung verwendet serverseitiges Paging und zeigt auch Dinge wie "Total Records" und "Total records (filtered)" an. Natürlich basieren diese "Metriken" auf einfachen Zählabfragen und sie funktionieren und zeigen das korrekte Ergebnis an. Die SELECT-Anweisung zum Abrufen der tatsächlichen Daten gibt jedoch 0 Treffer zurück. Besonders rätselhaft, weil es genau die gleiche Abfrage verwendet:

$sQueryInner = "SELECT id, ROW_NUMBER() OVER ($sOrderByClause) R 
      FROM my_table " . $sWhereClause; 

$sQueryFinal = "SELECT id FROM 
     (" . $sQueryInner . ") 
    WHERE R BETWEEN :startIndex and :endIndex"; 

// Total data set length after applying where 
$sQueryFilteredCount = "SELECT COUNT(*) as \"totalRowsCount\" FROM (" . $sQueryInner . ")"; 

Der einzige Unterschied ist die ROW_NUMBER() Klausel, aber ich sehe nicht, wie das wirkt sich Dinge, die keine Ergebnisse zurückgegeben. Ich bekomme auch keine Fehlermeldungen oder PHP-Warnungen. oci_fetch_array gibt sofort false zurück, was bedeutet, dass keine weiteren Zeilen gefunden wurden.

while ($row = oci_fetch_array($statementFinal, OCI_ASSOC + OCI_RETURN_NULLS)) {//... 

Ich wollte einen Weg finden, um oci8 selbst zu debuggen. Um zu sehen, die tatsächliche SQL gesendet. Aber oci_internal_debug scheint seit php5.6 deaktiviert zu sein.

So bin ich ziemlich verloren. Irgendwelche Ideen, was könnte das verursachen und wie könnte ich weiter debuggen/suchen, warum es verursacht wird?

EDIT:

Wit wireshark kann ich sehen, tatsächlich die SQL an die DB gesendet und es ist richtig. Problem ist, dass keine Zeilen zurückgegeben werden. Die einzige Schlussfolgerung ist, dass die Parameterbindung nicht korrekt funktioniert und daher keine Ergebnisse zurückgegeben werden. Ich verstehe es aber nicht, da genau dasselbe auf ubuntu 14.04 funktioniert. Einziger Unterschied ist php7. Alle anderen Anwendungen funktionieren ebenfalls, sodass das Problem bei dieser spezifischen Abfrage auftritt. Es hat eine subselect und Row_number() -Funktion.

Antwort

0

Dies ist ein weiterer WTF von PHP. Def. erwägen, in andere Sprache umzuschreiben ... Ernsthaft php Jungs, einen Griff bekommen ...

Sie changed something fundamental, die Auswirkungen oci_bind_by_name aber nicht erwähnt es überall.

Das Problem kann durch Neuanordnen Ihres Codes behoben werden. Das heißt, Sie haben es in dieser Reihenfolge tun, wenn Sie Ihre Anweisungen in einem Funktionsaufruf binden:

  1. Anweisungen erstellen
  2. Bind Anweisung 1
  3. Ausführungsanweisung 1
  4. Bind Statement 2
  5. Ausführungsanweisung 2

und so weiter. Wenn Sie zuerst alle Anweisungen binden und sie dann ausführen, überschreibt ein späterer Aufruf der Bindung den vorherigen Wert, selbst wenn der Parameter einen völlig anderen Namen und Typ hat. WTF?