MySQL 查询返回所有日期,而不是指定的年和月子句


MySQL Query returning all dates instead of specified year and month clauses

下面的代码返回表中的所有日期,就好像月份和年份子句不存在一样。但是,如果我不将月份和年份存储为变量,而只是使用常量日期,那么它可以正常工作。这怎么可能?谢谢。

$m="01";
$y="2015";
$get_my_dates = $db->query("SELECT * FROM dates WHERE YEAR('$y-01-01') = $y AND MONTH('2000-$m-01') = $m");
while($result = $get_my_dates->fetch_object()){
      echo $result->date."<br>";
}

看看你在做什么:

WHERE YEAR('$y-01-01') = $y ...

这将评估为:

WHERE YEAR('2015-01-01') = 2015 ...
WHERE 2015=2015 ...
WHERE TRUE ...

始终评估为 true。

您需要检查表中记录的日期,例如:

WHERE YEAR(datefield) = $y AND MONTH(datefield) = $m

这是因为查询的 WHERE 子句毫无意义。 您的 WHERE 条件将始终得到满足,因为您根本不检查字段值,而是检查您给出的输入值。

您应该像这样执行查询:

SELECT *
FROM dates
WHERE your_date_field >= '$y-$m-01 00:00:00'
AND your_date_field < '$y2-$m2-01 00:00:00'

这里$m2将设置为 $m1 + 1$y2 = $y ,除非$m当然等于 12,在这种情况下,您需要递增$y2 = $y + 1并设置$m2 = 1

请注意,我以这种方式编写了 WHERE 子句,而不是更简单的外观

WHERE YEAR(your_date_field) = $y
AND MONTH(your_date_field) = $m

因为前者可以在字段上使用索引,而后者则不会并且需要全表扫描。