【问题标题】:PDO: Different results with SQLite BETWEENPDO:SQLite BETWEEN 的不同结果
【发布时间】:2017-08-10 22:46:18
【问题描述】:

我有一个带有 unix 时间戳格式日期的 SQLite 表,我通过 PHP PDO 查询该表。我想根据日期范围标记行,在我的情况下,日期是在一年中的冬季学期还是夏季学期。

开始和结束日期是任意的,但就我而言,我选择了 start 是 3 月 1 日 (0301),end 是 9 月 14 日 (0914),所以我可以很容易地与 BETWEEN 联系。

当我在 PHP 中运行这个查询时,像这样,它返回一个不正确的结果("WS" 对于所有行):

$statement = $db->prepare('SELECT CASE WHEN 
    (CAST(strftime("%m%d", class_date, "unixepoch") AS DECIMAL) 
    BETWEEN :start AND :end) 
    THEN "SS" 
    ELSE "WS" END 
    AS semester FROM dates');

$statement->execute(array(
    ':start' => 301,
    ':end' => 915
));

但是当我将开始和结束日期嵌入为数字时,而不是绑定它们,它可以正常工作(一些行"WS",一些行"SS"):

$statement = $db->prepare('SELECT CASE WHEN 
    (CAST(strftime("%m%d", class_date, "unixepoch") AS DECIMAL) 
    BETWEEN 301 AND 915) 
    THEN "SS"
    ELSE "WS" END 
    AS semester FROM dates');
$statement->execute();

这里发生了什么,我该如何解决?任何帮助表示赞赏。

【问题讨论】:

    标签: php sql sqlite pdo


    【解决方案1】:

    PDOStatement::execute 的文档说它接受

    包含与正在执行的 SQL 语句中的绑定参数一样多的元素的值数组。所有值都被视为 PDO::PARAM_STR

    这意味着即使您输入301,它也会被视为"301"。 相反,您应该使用PDOStatement::bindValue。像这样:

    $statement->bindValue(':start', 301, PDO::PARAM_INT);
    $statement->bindValue(':end', 915, PDO::PARAM_INT);
    $statement->execute();
    

    【讨论】:

    • 完美运行!我怀疑它与类型有关,但我从来没有想过 bindValue 是一种可能的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多