gpt4 book ai didi

php - 将日期参数绑定(bind)到准备好的语句时出错——将 PHP PDO/ODBC 与 SQL Server 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:22 26 4
gpt4 key购买 nike

我有一个与 ODBC (v2000.86.359.00) 连接到 SQL Server(v8.00.2039 SP4 标准版)数据库的 pdo 连接。

这个有效:

$id = 486;
$duedate = 'June 27, 2012';
$query ="INSERT into AssetHistory (AssetID, DateDue) Values($id, $duedate);";
$noParams = $db->exec($query);
$db->query($query);

但是如果我尝试使用这样的准备好的语句:

$sql = 'INSERT into AssetHistory 
(AssetID, DateDue)
Values(:id, :duedate);';

$input = array(':id'=>486, ':duedate'=>'June 27, 2012');
$smt = $db->prepare($sql);
$smt->execute($input);

我得到这个错误(来自 $smt->errorInfo()):

 "[Microsoft][ODBC Driver Manager] Function sequence error (SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254)"

我试过:1) 用单引号将 :duedate 括起来2) 绑定(bind)日期到 unix 时间戳整数3) 绑定(bind) :duedate 到 php DateTime 对象4) 在准备之前将 $duedate 插入到 sql 语句中

在这一点上,我可能无法使用 $db->query 方法并尽我所能清理输入,但我真的很感激任何建议。

在 Windows Server 2003 机器上使用 PHP 5.38。

更新:我已经从这个问题的先前版本中删除了一些变量。错误信息变了,但最终结果是一样的。

我也试过像这样手动绑定(bind)参数:

$smt->bindValue(':id', 486, PDO::PARAM_INT);
$smt->bindValue(':duedate', 'June 27, 2012', PDO::PARAM_STR);

像这样将转换函数添加到 sql 中:

$sql = 'INSERT into AssetHistory 
(AssetID, DateDue)
Values(:id, convert(datetime,:duedate, 100));';

返回: “COUNT 字段不正确或语法错误”

而且我注意到 SQL Server 并不是真正的 play nice带有 unix 时间戳...

最佳答案

最后通过下载并安装 sqlsrv php drivers 解决了这个问题(我使用的是 2.0 版)和 SQL Server 2008 Native Client .

只要对 $dsn 参数稍作调整,其余代码就像魔术一样工作——不需要绑定(bind)、转换或强制转换。

我最终只使用了 php_pdo_sqlsrv_53_ts_vc9.dll,但请确保您选择了正确的线程安全/非线程安全驱动程序版本,因为 php.ini 中的错误 dll 将使您的服务器崩溃。

关于php - 将日期参数绑定(bind)到准备好的语句时出错——将 PHP PDO/ODBC 与 SQL Server 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213831/

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