将日期参数绑定到准备好的语句时出错--在SQL Server中使用PHP PDO/ODBC

将日期参数绑定到准备好的语句时出错--在SQL Server中使用PHP PDO/ODBC,php,sql-server,odbc,Php,Sql Server,Odbc,我有一个pdo连接,ODBC(v2000.86.359.00)连接到SQL Server(v8.00.2039 SP4标准版)数据库 这项工作: $id = 486; $duedate = 'June 27, 2012'; $query ="INSERT into AssetHistory (AssetID, DateDue) Values($id, $duedate);"; $noParams = $db->exec($query); $db->

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

这项工作:

$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()):

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

在这一点上,我可能会被困在使用$db->query方法和尽可能地清理输入的过程中,但我真的非常感谢任何建议

在WindowsServer2003上使用PHP5.38

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

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

$smt->bindValue(':id', 486, PDO::PARAM_INT);
$smt->bindValue(':duedate', 'June 27, 2012', PDO::PARAM_STR);
除了将convert函数添加到sql之外,如下所示:

$sql = 'INSERT into AssetHistory 
   (AssetID, DateDue)
Values(:id, convert(datetime,:duedate, 100));';
返回: “计数字段不正确或语法错误”

我注意到SQL Server实际上没有unix时间戳…

您试过了吗

你也可以试着在陈述中使用

 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版)和解决了这个问题

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

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

计数字段不正确或语法错误如果设置了参数化查询,但未能在“参数”列表中传递所需数量的参数,则可能发生这种情况


不过,您的代码在这方面看起来还不错。

带有格式化日期的字符串——我尝试过“2012年6月27日”和“2012-06-27 00:00.000”好吧,您尝试过长格式:
$smt->bindValue(“:duedate”,“$duedate,PDO::PARAM_INT”)?或者,铸造
$duedate=intval($duedate)?感谢您的建议,我已经更新了问题。在这一点上,我尝试了所有建议,但都没有成功。在这一点上,我在数组中使用了字符串文字:
$input=array(':id'=>486',:借用者'=>JOHNSMITH',':loaner'=>KOPERW',':duedate'=>2012年6月27日',':loaneragain'=>KOPERW')在此之前,我尝试了
$duedate=strottime('2012年6月27日')
返回了一个整数和相同的错误。是的,SQL中的数据类型是datetime。
 convert(datetime, :duedate, 100)
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"