[英]Error when binding date parameter to prepared statement — Using PHP PDO/ODBC with SQL Server
我有一個連接到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 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);
將convert函數添加到sql中,如下所示:
$sql = 'INSERT into AssetHistory
(AssetID, DateDue)
Values(:id, convert(datetime,:duedate, 100));';
返回:“COUNT字段不正確或語法錯誤”
而且我注意到SQL Server與unix時間戳並不是很好用......
最后通過下載並安裝sqlsrv php驅動程序 (我使用的是2.0版)和SQL Server 2008 Native Client來解決這個問題。
通過對$ dsn參數進行一些調整,其余代碼就像魔術一樣 - 不需要綁定,轉換或轉換。
我最后只使用了php_pdo_sqlsrv_53_ts_vc9.dll
,但請確保選擇正確的線程安全/非線程安全版本的驅動程序,因為php.ini中的錯誤dll會使服務器崩潰。
你試過strtotime嗎?
$phpdate = strtotime( $duedate);
您也可以在語句中嘗試使用SQL的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"
如果設置參數化查詢但未能在參數列表中傳遞所需數量的參數,則可能會出現“COUNT字段不正確或語法錯誤”。
但是,您的代碼在該方面看起來還不錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.