我有一个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();
这里发生了什么,我该如何解决?任何帮助表示赞赏。
答案 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();