【发布时间】:2013-06-28 19:44:15
【问题描述】:
我创建了一个 PDO 数据库类,用于在 MS Access 数据库上运行查询。 使用日期条件进行查询时,如 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] 在 分机\pdo_odbc\odbc_stmt.c:254)' 在 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): 数据库->execute() #2 C:\xampp\htdocs\ips\try2.php(12): 数据库->resultset() #3 {main} 在第 49 行的 C:\xampp\htdocs\ips\php\classes.php 中抛出
【问题讨论】: