【发布时间】:2012-06-26 18:34:14
【问题描述】:
我有一个使用 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) 将日期绑定到 unix 时间戳整数 3) 绑定 :duedate 到 php DateTime 对象 4) 在准备之前将 $duedate 插入到 sql 语句中
此时我可能无法使用 $db->query 方法并尽我所能清理输入,但我非常感谢任何建议。
在 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 时间戳...
【问题讨论】:
-
带有格式化日期的字符串 -- 我试过 'June 27, 2012' 和 '2012-06-27 00:00.000'
-
好吧,你试过长格式:
$smt->bindValue(':duedate',$duedate,PDO::PARAM_INT);?或者,投射$duedate=intval($duedate);? -
感谢您的所有建议,我已更新问题。在这一点上,我已经尝试了所有建议但没有成功。
标签: php sql-server odbc