次の設定を使用して、PHPアプリケーションからMS-SQLデータベースにアクセスしています
- RedHat Enterprise Linux 5
- PDOおよびPDO_ODBCを使用したPHP5.2.14
- unixODBC 2.2.11
- FreeTDS 0.82.1.dev.20100810
パラメータ化されていないクエリは正常に機能します。唯一の問題は、「0 [FreeTDS] [SQL Server]無効なカーソル状態(SQLSTATE = 24000)」エラーを回避するために、単一の結果ステートメント(PDOStatment :: closeCursorを使用)でカーソルを閉じることを強制されることです。
しかし、型指定されたバインドされたパラメーターに大きな問題があります。このようなコードを使用する場合:
$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();
}
ここで、両方の列はINTです。「206[FreeTDS][SQL Server] Operand type clash:text is incompatible with int [SQLSTATE=22018]」エラーが発生します。
unixODBCログでは、次のようなものが得られます
[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]
ログについての私の理解は、unixODBCが正しいタイプを使用してパラメーターをバインドしようとしているということです。ただし、FreeTDSはこの機能をサポートしていません(IM001は「ドライバはこの機能をサポートしていません」です)。したがって、unixODBCは適切な入力なしで続行します。
誰かがこの診断を確認できますか、より良いのは、FreeTDSの型付きバインドパラメータに関する既知の問題ですか?はいの場合、PHP PDOを使用して動作しますか?構成できますか?