2012-06-26 11 views
5

SQL Server(v8.00.2039 SP4 Standard Edition)データベースに接続するODBC(v2000.86.359.00)とのpdo接続があります。 ()($ smt-から>のerrorInfo)を日付パラメータをプリペアドステートメントにバインドするときのエラー - PHP PDO/ODBCとSQL Serverの使用

$sql = 'INSERT into AssetHistory 
    (AssetID, DateDue) 
    Values(:id, :duedate);';     

$input = array(':id'=>486, ':duedate'=>'June 27, 2012'); 
$smt = $db->prepare($sql); 
$smt->execute($input); 

私はこのエラーを取得する:

$id = 486; 
$duedate = 'June 27, 2012'; 
$query ="INSERT into AssetHistory (AssetID, DateDue) Values($id, $duedate);";     
$noParams = $db->exec($query); 
$db->query($query); 

をしかし、私はこのように準備されたステートメントを使用しようとした場合:

これは動作します

"[Microsoft][ODBC Driver Manager] Function sequence error (SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254)" 

私は試しました: 1)囲み:二重引用符で一重引用符 2)バインドUnixタイムスタンプの整数 〜3日)結合:PHPのDateTimeオブジェクト 4にduedateを)私は$ DB-> queryメソッドを使用して入力を消毒立ち往生される可能性があります。この時点で

を準備する前に、SQL文の中にだけ$ duedateを挿入私ができる限り最高ですが、私は本当に何か提案を感謝します。

Windows Server 2003のボックスでPHP 5.38を使用しています。

更新: この質問の以前のバージョンからいくつかの変数を削除しました。エラーメッセージは変更されましたが、最終結果は同じです。

私もそうのようなパラメータバインディングを手動試してみた:そのようなSQLに変換する機能を追加するとともに

$smt->bindValue(':id', 486, PDO::PARAM_INT); 
$smt->bindValue(':duedate', 'June 27, 2012', PDO::PARAM_STR); 

を:

返し
$sql = 'INSERT into AssetHistory 
    (AssetID, DateDue) 
Values(:id, convert(datetime,:duedate, 100));'; 

: 「COUNTフィールドを間違ってまたは構文エラー "

そして、私はSQL ServerがUNIXのタイムスタンプ付きのplay niceではないことに気付きました。

+0

「duedate」には何が含まれていますか? –

+0

フォーマットされた日付の文字列 - 2012年6月27日と '2012-06-27 00:00.000'を試しました –

+0

長い形式を試してみましたか?$ smt-> bindValue( ':duedate' 、$ duedate、PDO :: PARAM_INT); '?または、 '$ duedate = intval($ duedate);をキャストします; – Wrikken

答えて

3

が最後にsqlsrv php drivers(私はバージョン2.0を使用)とSQL Server 2008 Native Clientの両方をダウンロードし、インストールすることで、これを解決しました。

$ dsnパラメータを微調整しても、残りのコードは魔法のように機能します。バインディング、変換、キャストは不要です。

私は最後にphp_pdo_sqlsrv_53_ts_vc9.dllを使用しましたが、php.iniの間違ったdllがあなたのサーバーをクラッシュさせるので、ドライバの正しいスレッドセーフ/非スレッドセーフバージョンを選択してください。

1

strtotimeを試しましたか?

$phpdate = strtotime($duedate); 

また、SQLでデータ型が日時、正しいでしょうか?

convert(datetime, :duedate, 100) 

あなたの文でSQL's CONVERTを使用して試みることができますか

OR試してみてください。

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" 
+0

同じエラー。 –

+0

$$ duedate = – user1166147

+0

この時点で、私は配列の文字列リテラルを使用しています: '$ input = array( ':id' => 486、 ':borrower' => 'JOHNSMITH'、 ':loaner' 2012年6月27日、 ':loaneragain' => 'KOPERW'); ' –

0

パラメータ化されたクエリを設定したが、パラメータリストに必要な数のパラメータを渡すことができない場合、「COUNTフィールドが正しくないか構文エラー」が発生する可能性があります。

あなたのコードは大丈夫です。

関連する問題