5

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タイムスタンプではうまく機能しないことに気づきました...

4

3 に答える 3

3

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

$ dsnパラメーターを少し調整するだけで、残りのコードは魔法のように機能します。バインド、変換、キャストは必要ありません。

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

于 2012-06-28T22:37:05.230 に答える
1

strtotimeを試しましたか?

 $phpdate = strtotime( $duedate);

ステートメントでSQLCONVERTを使用することもできます

 convert(datetime, :duedate, 100)

SQLのデータ型は日時ですよね?

または試してみてください:

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"
于 2012-06-26T19:16:02.857 に答える
0

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

ただし、コードはその面では問題ないように見えます。

于 2012-12-03T02:33:32.767 に答える