我使用以下设置从 PHP 应用程序访问 MS-SQL 数据库
- 红帽企业 Linux 5
- PHP 5.2.14 与 PDO 和 PDO_ODBC
- unixODBC 2.2.11
- 免费TDS 0.82.1.dev.20100810
非参数化查询工作正常。唯一的问题是强制关闭单个结果语句上的游标(使用 PDOStatment::closeCursor)以避免“0 [FreeTDS][SQL Server] 游标状态无效 (SQLSTATE=24000)”错误。
但我在类型化绑定参数方面遇到了一个主要问题。当使用这样的代码时:
$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]操作数类型冲突:文本与 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 工作吗?我可以配置它吗?