ich das folgende Setup bin mit 5.2 eine MS-SQL-Datenbank zuzugreifen aus einer PHP-AnwendungMit getippt gebunden Parameter mit PHP PDO-ODBC, unixODBC und FreeTDS
- RedHat Enterprise Linux 5
- PHP. 14 mit PDO und PDO_ODBC
- unixODBC 2.2.11
- FreeTDS 0.82.1.dev.20100810
Unparametrized Abfragen funktionieren. Das einzige Problem besteht darin, den Cursor auf einzelne Ergebnisanweisungen zu schließen (mit PDOStatment :: closeCursor), um Fehler "0 [FreeTDS] [SQL Server] Ungültiger Cursor (SQLSTATE = 24000)" zu vermeiden.
Aber ich habe ein großes Problem mit typisierten gebundenen Parameter. Bei Verwendung von Code wie folgt:
$stmt = $PDO->prepare('INSERT INTO table (column1, column2) VALUES (:foo, :bar');
$stmt->bindValue(':foo', 21, PDO::PARAM_INT);
$stmt->bindValue(':bar', 42, PDO::PARAM_INT);
$stmt->execute():
if (!$stmt->execute()) {
var_dump($stmt->errorInfo();
}
Wo beide Spalten INT sind. Ich erhalte den Fehler "206 [FreeTDS] [SQL Server] Operand type": text ist nicht kompatibel mit int [SQLSTATE = 22018] "error.
Im unixODBC log, erhalte ich so etwas wie
[ODBC][26251][SQLDescribeParam.c][175]
Entry:
Statement = 0x2b73c849fb80
Parameter Number = 1
SQL Type = 0x7fff9c89e15e
Param Def = 0x7fff9c89e154
Scale = 0x7fff9c89e15c
Nullable = 0x7fff9c89e15a
[ODBC][26251][SQLDescribeParam.c][276]Error: IM001
[ODBC][26251][SQLBindParameter.c][193]
Entry:
Statement = 0x2b73c849fb80
Param Number = 1
Param Type = 1
C Type = 1 SQL_C_CHAR
SQL Type = -1 SQL_LONGVARCHAR
Col Def = 4000
Scale = 5
Rgb Value = 0x2b73c941f890
Value Max = 0
StrLen Or Ind = 0x2b73c93fa1b0
[ODBC][26251][SQLBindParameter.c][339]
Exit:[SQL_SUCCESS]
Mein Verständnis des Stammes ist, dass unixODBC versucht, die Parameter zu binden, um die richtige Art verwenden. Aber die FreeTDS unterstützt die Funktion nicht (IM001 ist 'Treiber unterstützt diese Funktion nicht'). Also unixODBC weiter ohne richtig tippen.
Kann jemand diese Diagnose bestätigen oder, besser, ein bekanntes Problem mit typisierten gebundenen Parametern in FreeTDS? Wenn ja, funktionieren sie mit PHP-PDO und wo kann ich es konfigurieren?
Bis jemand Ihnen eine echte (spezifische) Lösung geben kann, sollten Sie '$ PDO-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, true);' als Workaround versuchen, damit Sie zumindest weiter entwickeln können ;-) – VolkerK
Leider Wenn ich $ PDO-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, true) benutze, erhalte ich einen weiteren schönen Fehler: "SQLSTATE [IM001]: Treiber unterstützt diese Funktion nicht: Treiber unterstützt die Einstellung von Attributen nicht". –