MS Access データベースでクエリを実行するために使用する PDO データベース クラスを作成しました。SQL でよくあるように、日付条件を使用してクエリを実行する場合、日付は文字列として渡されます。ただし、Access は通常、日付がハッシュで囲まれていることを想定しています。例えば
SELECT transactions.amount FROM transactions WHERE transactions.date = #2013-05-25#;
PDO を使用してこのクエリを実行する場合、次のようにします。
//instatiate pdo connection etc... resulting in a $db object
$stmt = $db->prepare('SELECT transactions.amount FROM transactions WHERE transactions.date = #:mydate#;'); //prepare the query
$stmt->bindValue('mydate', '2013-05-25', PDO::PARAM_STR); //bind the date as a string
$stmt->execute(); //run it
$result = $stmt->fetch(); //get the results
私の理解によると、上記の結果のステートメントは、文字列をバインドすると引用符で囲まれるため、次のようになります。
SELECT transactions.amount FROM transactions WHERE transactions.date = #'2013-05-25'#;
これによりエラーが発生し、ステートメントを実行できなくなります。
このエラーを発生させずに PDO で日付文字列をバインドする最良の方法は何ですか? 私は現在sprintf
、悪い習慣であると確信している文字列を -ing することに頼っています。
編集:ハッシュで囲まれた日付を渡すと、次のようなエラーが表示されます:
致命的なエラー: 例外 'PDOException' がキャッチされず、メッセージ 'SQLSTATE[22018]: キャスト仕様の文字値が無効です: -3030 [Microsoft][ODBC Microsoft Access Driver] 条件式のデータ型が一致しません。(SQLExecute[-3030] at ext\pdo_odbc\odbc_stmt.c:254)' in C:\xampp\htdocs\ips\php\classes.php:49 スタック トレース: #0 C:\xampp\htdocs\ips\php \classes.php(49): PDOStatement->execute() #1 C:\xampp\htdocs\ips\php\classes.php(52): database->execute() #2 C:\xampp\htdocs\ips \try2.php(12): database->resultset() #3 {main} が C:\xampp\htdocs\ips\php\classes.php の 49 行目にスローされる