在MS Access PDO查询中绑定日期字符串参数

时间:2013-07-01 15:54:24

标签: php sql ms-access pdo

我创建了一个PDO数据库类,用于在MS Access数据库上运行查询。 使用日期条件查询时(如SQL中常见的),日期将作为字符串传递。 Access通常期望日期被哈希包围。 E.g。

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字符串,我确信这是不好的做法。

编辑:如果我传递哈希包围的日期,那么我仍然会收到如下错误:

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [22018]:强制转换规范的字符值无效:   -3030 [Microsoft] [ODBC Microsoft Access驱动程序]条件表达式中的数据类型不匹配。 (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}   在第49行的C:\ xampp \ htdocs \ ips \ php \ classes.php中抛出

2 个答案:

答案 0 :(得分:1)

通常在使用预准备语句或参数化查询时,您不必担心分隔字符串和日期值;所有这些都是“在幕后”处理的。

我只是尝试了以下内容,它对我有用:

<?php
$connStr = 
        'odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};' .
        'Dbq=C:\\Users\\Gord\\Desktop\\Database1.accdb;' .
        'Uid=Admin;Pwd=;';

$dbh = new PDO($connStr);

$sql = 
        "INSERT INTO tblDateTest (dateCol) VALUES (?)";

$newDateTimeValue = "2013-06-30 17:18:19";

$sth = $dbh->prepare($sql);
if ($sth->execute(array($newDateTimeValue))) {
    echo "Done\r\n";
}
else {
    $arr = $sth->errorInfo();
    print_r($arr);
}

答案 1 :(得分:0)

您应该将日期(整个值)放在bindValue方法中。例如:

$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