【问题标题】:Binding a date string parameter in an MS Access PDO query在 MS Access PDO 查询中绑定日期字符串参数
【发布时间】: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 中抛出

【问题讨论】:

    标签: php sql ms-access pdo


    【解决方案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);
    }
    

    【讨论】:

    • 呃,是的,我只需要删除所有引号和哈希值,它现在就可以工作了。我觉得现在问这个有点愚蠢......谢谢
    【解决方案2】:

    你应该把你的日期(整个值)放在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
    

    【讨论】:

    • 好的,但这不会导致类似...WHERE date='#2013-05-25#'; 的结果吗?我会尽量尝试。
    • 是的 - 但先看看它是否有效。如果没有,您可能需要求助于运行原始查询,因为您无法从这样的准备好的语句中删除引号。
    • 它没有用。看我上面的编辑。 @GordThompson 解决了它
    • 我有一种预感,PDO 会在您不必提供日期分隔符的情况下处理此问题。很高兴知道并确认。谢谢!
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 2015-11-19
    • 2011-09-23
    • 2014-12-20
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多