将日期参数绑定到准备好的语句时出错--在SQL Server中使用PHP PDO/ODBC
我有一个pdo连接,ODBC(v2000.86.359.00)连接到SQL Server(v8.00.2039 SP4标准版)数据库 这项工作:将日期参数绑定到准备好的语句时出错--在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->
$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"