我正在使用以下设置从 PHP 应用程序访问 MS-SQL 数据库
- 红帽企业 Linux 5
- 带有 PDO 和 PDO_ODBC 的 PHP 5.2.14
- unixODBC 2.2.11
- FreeTDS 0.82.1.dev.20100810
未参数化的查询工作正常。唯一的问题是被迫关闭单个结果语句上的游标(使用 PDOStatment::closeCursor)以避免“0 [FreeTDS][SQL Server] Invalid cursor state (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 工作,我可以配置它吗?