2016-03-31 14 views
1

Ich bin mit ADOdb PHP-Bibliothek (https://sourceforge.net/projects/adodb/) und MSSQL Server 2012Fragezeichen Problem mit ADOdb und MSSQL

in ein Problem laufen

Ich bin mit einem Platzhalter eine einfache Update-Anweisung zu tun, genau wie diese, aber es ist immer sagen, dass ich nicht genug Parameter an die Funktion Execute gegeben hat:

UPDATE report SET custom='Is this ok?' WHERE ID = ?

ich die adodb-mssql.inc.php geprüft und in der Funktion Bereiten sie es jeder einfach ersetzen? mit der @P Syntax für MSSQL, anstelle der Prüfung, was ein Platzhalter ist und was nicht:

function Prepare($sql) 
{ 
    $sqlarr = explode('?',$sql); 
    if (sizeof($sqlarr) <= 1) return $sql; 
    $sql2 = $sqlarr[0]; 
    for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) { 
     $sql2 .= '@P'.($i-1) . $sqlarr[$i]; 
    } 
    return array($sql,$this->qstr($sql2),$max,$sql2); 
} 

Also in meiner Anfrage bekomme ich 2 @P params (@ P0 innerhalb der Anführungszeichen (nicht als Platzhalter gedacht) , @ P1 als der reale Platzhalter), was zu dem bereits erwähnten Fehler führt, da ich nur die Execute-Funktion 1 Parameter anstelle von zwei ersetzen lasse.

Ist dies ein bekanntes Limit der ADOdb-Bibliothek? Muss ich jedes Feld überprüfen und das Fragezeichen, das nicht als Platzhalter verwendet wird, durch etwas anderes ersetzen, bevor ich die Abfrage ausführe oder fehlt mir etwas?

+0

Dies ist eine bekannte Einschränkung von endlosen Werkzeugen im Treiber gelöst werden, die vorbereiteten Anweisungen stumm string Ersatz emulieren. Aber das sieht zu schlecht aus um wahr zu sein. Sind Sie sicher, dass Sie die neueste verfügbare Version verwendet haben? –

+0

5.18, jetzt auf 5.20 upgraden, nur um zu testen, ob das irgendwie behoben wurde, aber die Prepare-Funktion sieht in beiden Versionen gleich aus. EDIT: Upgrade auf 5.20, dasselbe Problem: Warnung: mssql_query(): Nachricht: Muss die Skalarvariable "@ P1" deklarieren. – Cusy

Antwort

1

Ich war browsing the code. Diese Bibliothek ist schrecklich veraltet (es ist für PHP/4 geschrieben!) Und der Mssql-Treiber ist besonders schlecht. Vielleicht haben Sie mehr Glück, wenn Sie die PDO- oder SQLSRV-Treiber verwenden können (zumindest scheinen sie native Prepared-Anweisungen zu verwenden), aber ich denke, es ist eine bestehende Legacy-App oder Sie würden diese Bibliothek gar nicht erst verwenden.

Wenn Sie keine Treiber wechseln (oder so nicht lösen das Problem nicht tun) Ich denke, dass Sie mit dem Bug leben und auch statische Strings als Parameter übergeben, wenn Sie hier:

$sql = "UPDATE report SET custom='Is this ok?' WHERE ID = ?"; 

... in diese:

$sql = "UPDATE report SET custom = ? WHERE ID = ?"; 
0

Sofern Sie die Datenbank über FreeTDS oder ähnliches zugreifen möchten, können Sie den falschen Treiber verwenden. Sie sollten den mssqlnative-ADOdb-Treiber verwenden, der ursprünglich von Microsoft an das Projekt gesendet wurde.

Wenn Sie immer noch Probleme haben, sollten Sie ein Problem bei Github, einreichen, um zu sehen, ob dies