PDO :: bindValue () schlägt bei Abfrage mit verschachteltem SELECT fehl

8

Ich verwende eine MSSQL-Datenbank, die über ODBC verbunden ist.

Bei Verwendung von PDO::bindValue() für eine Abfrage mit einer verschachtelten SELECT-Anweisung können Werte in der verschachtelten SELECT-Anweisung nicht gebunden werden (kein Problem bei der primären SELECT-Anweisung). Dies ist ein Beispielcode, der fehlschlägt:

%Vor%

Der Fehler, den ich bekomme, ist:

  

SQLSTATE [22018]: ungültiger Zeichenwert für die Cast-Spezifikation: 206 [Microsoft] [SQL Server Native Client 11.0] [SQL Server] Operandentyp Konflikt: text ist nicht kompatibel mit int (SQLExecute [206] at / builddir / build / BUILD / php-5.4.16 / ext / pdo_odbc / odbc_stmt.c: 254)

Wenn ich die bindValue() für ": locationid" weglasse und '1011' direkt in die Abfrage einfüge, wird der Aufruf ohne Fehler und mit den richtigen Ergebnissen abgeschlossen.

Ist das ein Fehler in PDO oder muss ich bindValue () anders aufrufen?

    
Dandorid 04.04.2017, 12:19
quelle

2 Antworten

4

Wie (ich lese aus Kommentaren) sagt bindValue , dass der übergebene Wert eine Ganzzahl ist löst nicht das Problem ...

%Vor%

... Ich nehme an, dass aus irgendeinem Grund ( ein Fehler in pdo_odbc ? ) Der Parameter gibt die Abfrage als Zeichenfolge ein, unabhängig davon, was Sie als dritten Parameter angeben bindValue .

Ich würde dann vorschlagen, dies zu umgehen, indem Sie den Wert auf Integer anstelle in die Abfrage umsetzen.

In der letzten Zeile:

%Vor%

Dies ist nicht sehr elegant, aber möglicherweise geeignet, bis Sie einen Fix / Patch für pdo_odbc

finden

Wenn das auch nicht funktioniert gibt es eine noch elegantere Lösung (natürlich als temporäre Lösung).

Sie haben geschrieben:

  

Wenn ich bindValue () für ": locationid" weglasse und '1011' direkt in die Abfrage einfüge, wird der Aufruf ohne Fehler und mit den richtigen Ergebnissen abgeschlossen.

Sie können also location id direkt in die Abfrage einfügen.

Wenn angenommen wird, dass die Standort-ID in $locationId gespeichert ist, wird die letzte Zeile der Abfrage zu:

%Vor%

Da dies für sql-injection anfällig ist, muss $locationId zuvor bereinigt (oder verifiziert) werden.

Der Wert muss eine positive Ganzzahl sein, daher schlage ich einen einfacheren und kugelsicheren Ansatz vor: check $locationId wird nur aus Zahlen gebildet ...

%Vor%     
Paolo 14.04.2017, 13:18
quelle
1

Könnte es sein, dass die Location ID tatsächlich in MSSQL als String und nicht als int gespeichert ist? Funktioniert es, wenn Sie Anführungszeichen hinzufügen?     $ stmt- & gt; bindValue ("locationid", "1011", PDO :: PARAM_STR);

    
delboy1978uk 12.04.2017 10:15
quelle

Tags und Links