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:
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?
Wie (ich lese aus Kommentaren) sagt bindValue
, dass der übergebene Wert eine Ganzzahl ist löst nicht das Problem ...
... 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
findenWenn 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:
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 ...
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);