簡體   English   中英

將date參數綁定到預准備語句時出錯 - 將PHP PDO / ODBC與SQL Server一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM