我与ODBC(v2000.86.359.00)建立了pdo连接,连接到SQL Server(v8.00.2039 SP4 Standard Edition)数据库。

这有效:

$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)括起来:用单引号引起来
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确实没有使用unix时间戳play nice ...

最佳答案

最后,通过下载并安装sqlsrv php drivers(我使用的是2.0版)和SQL Server 2008 Native Client来解决此问题。

稍微调整$ dsn参数,其余代码的工作原理就像魔术一样-无需绑定(bind),转换或强制转换。

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

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

10-11 22:09
查看更多