将date参数绑定到预准备语句时出错 - 将PHP PDO / ODBC与SQL Server一起使用

时间:2012-06-26 18:34:14

标签: php sql-server odbc

我与连接到SQL Server(v8.00.2039 SP4标准版)数据库的ODBC(v2000.86.359.00)建立了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 in single quotes 2)将日期绑定到unix时间戳整数 3)绑定:duedate到php DateTime对象 4)在准备

之前,只将$ duedate插入sql语句

此时我可能会陷入使用$ db->查询方法并尽可能地清理输入,但我真的很感激任何建议。

在Windows Server 2003框中使用PHP 5.38。

更新的 我已从此问题的先前版本中删除了一些变量。错误消息已更改,但最终结果相同。

我还尝试手动绑定参数,如下所示:

$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时间戳...

3 个答案:

答案 0 :(得分:3)

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

通过对$ dsn参数进行一些调整,其余的代码就像魔法一样 - 不需要绑定,转换或转换。

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

答案 1 :(得分:1)

您是否尝试过strtotime

 $phpdate = strtotime( $duedate);

您还可以尝试在声明中使用SQL's CONVERT

 convert(datetime, :duedate, 100)

SQL中的数据类型是datetime,对吗?

或尝试:

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate'=>strtotime($duedate),

array(':id'=>486, ':borrower'=> 'name', ':loaner'=>'KOPERW', ':duedate"=>$duedate),"0000-00-00 00:00:00"

答案 2 :(得分:0)

如果设置参数化查询但未能在参数列表中传递所需数量的参数,则可能会出现“COUNT字段不正确或语法错误”。

然而,你的代码在这方面看起来还不错。