我在日历背面有以下代码:
// I get this from ajax (start month + end of the month)
$post_date_start = $_POST['date_start']; // start month (always), ie: 2015-09-01
$post_date_ending = $_POST['date_ending']; // end month (always), ie: 2015-09-31
// If I get an event which its duration its between $post_date_start and $post_date ending it works properly as you can see:
SELECT * FROM calendar WHERE start_date >= '$post_date_start' AND ending_date <= '$post_date_ending'
问题:它实际上会在'这些范围内正确返回结果。但是,如果start_date
或ending_date
不在此范围内,则不会返回任何内容。
例如,活动于2015年9月7日开始,2015年12月8日结束。它应该显示在九月,十月,十一月和十二月......)。问题是......拥有这两个参数,我该如何在每个月/每年显示事件?谢谢!
答案 0 :(得分:0)
您正在将日期列与字符串文字进行比较,从而强制数据库隐式地将其转换为另一个。显然,日期正在转换为字符串,并且按字典顺序进行比较。相反,您应该将字符串显式转换为日期,因此比较由日期值完成:
SELECT *
FROM calendar
WHERE start_date >= STR_TO_DATE('$post_date_start', '%Y-%m-%d') AND
ending_date <= STR_TO_DATE('$post_date_ending', '%Y-%m-%d')
强制性评论:
在SQL语句中使用字符串替换是一个坏主意,使您的应用程序容易受到SQL注入攻击。您应该考虑使用prepared statement代替。