gpt4 book ai didi

php - 在 PHP PDO-ODBC、unixODBC 和 FreeTDS 中使用类型化绑定(bind)参数

转载 作者:可可西里 更新时间:2023-11-01 13:13:59 30 4
gpt4 key购买 nike

我正在使用以下设置从 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] 游标状态无效 (SQLSTATE=24000)”错误。

但是我在类型化绑定(bind)参数方面遇到了一个主要问题。使用这样的代码时:

$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 正在尝试使用正确的类型绑定(bind)参数。但是 FreeTDS 不支持该功能(IM001 是'Driver does not support this function')。所以 unixODBC 在没有正确输入的情况下继续。

有人可以确认这个诊断,或者更好的是,FreeTDS 中类型绑定(bind)参数的已知问题吗?如果是,它们是否使用 PHP PDO 工作,我可以配置它吗?

最佳答案

在 FreeTDS 邮件列表中,我收到了 confirmation that SQLDescribeParam is not supported in FreeTDS .但是当不支持 SQLDescribeParam 时,PDO_ODBC is to blame用于使用 LONGVARCHAR(即文本)。

相同的代码在带有 PDO ODBC(PHP 版本 5.2.9,ODBC 库 Win32)的 Windows 工作站上运行

此问题的解决方法是将每个参数都视为 LONGVARCHAR 并在查询中使用显式类型转换。 MS SQL Server only supports LONGVARCHAR => *CHAR conversions .要进行转换,我必须使用 CAST(CAST(:number AS varchar) AS INTEGER)CAST(CAST(:birthdate AS varchar) AS datetime) 之类的东西。它很糟糕、丑陋,而且可能是一个性能问题,但它有效

关于php - 在 PHP PDO-ODBC、unixODBC 和 FreeTDS 中使用类型化绑定(bind)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3828215/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com