下面的代码返回表中的所有日期,就好像月份和年份子句不存在一样。但是,如果我不将月份和年份存储为变量并且仅使用常量日期,那么它可以正常工作。这怎么可能?感谢。
$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>";
}
答案 0 :(得分:4)
看看你在做什么:
WHERE YEAR('$y-01-01') = $y ...
这将评估为:
WHERE YEAR('2015-01-01') = 2015 ...
WHERE 2015=2015 ...
WHERE TRUE ...
和总是评估为真。
您需要检查表格中记录的日期,例如:
WHERE YEAR(datefield) = $y AND MONTH(datefield) = $m
答案 1 :(得分:2)
这是因为你的查询的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
因为前者可以在字段上使用索引,而后者则不需要全表扫描。