SQL Server(v8.00.2039 SP4 Standard Edition)データベースに接続している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-> queryメソッドを使用して入力を可能な限りサニタイズすることに固執する可能性がありますが、提案をいただければ幸いです。
WindowsServer2003ボックスでのPHP5.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フィールドが正しくないか、構文エラー」
そして、SQLServerがUNIXタイムスタンプではうまく機能しないことに気づきました...