PDO:SQLite BETWEEN的结果不同

时间:2017-03-19 18:19:37

标签: php sql sqlite pdo

我有一个SQLite表,其日期为unix时间戳格式,我通过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();

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

1 个答案:

答案 0 :(得分: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();