我的日历背面有以下代码:
// 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
不在这个范围内,它将不返回任何东西。
例如,起始日期为07-09-2015,结束日期为08-12-2015。应该在9月、10月、11月和12月…)显示。问题是……有了这两个参数,我如何才能在每个月/年显示事件?谢谢!
您正在比较日期列和字符串文字,迫使数据库隐式地将其中一个转换为另一个。显然,日期被转换为字符串,比较是按字典顺序进行的。相反,您应该显式地将字符串转换为日期,以便通过日期值进行比较:
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注入攻击。您应该考虑使用预处理语句。