事件与MYSQL冲突; PHP事件日历

时间:2012-02-13 07:13:09

标签: php mysql database events calendar

所以我在一个客户网站上工作,它包括一个活动日历作为其主要焦点。日历功能:您可以插入带有日期,start_time,end_time的事件。然后它显示在日历上,你得到的图片。我遇到的问题是当前事件与人们试图预订为新事件之间的冲突。我在逻辑上知道我需要检查它是否:

    事件之间的
  1. 在活动期间,但在它之前开始
  2. 在活动期间,但在此期间开始,之后结束。
  3. 我开始编写的sql查询就是这个(它不起作用):

    $check_date_time = "SELECT `event_date`, `start_time`, `end_time` FROM `calendar_events` WHERE
     '.$_POST['event_date'].' = event_date AND
    '.$_POST['start_time'].' BETWEEN `start_time` AND `end_time` 
    AND '.$_POST['start_time'].' < `start_time` AND '.$_POST['end_time'].' < `end_time` 
    || '.$_POST['start_time'].' > `start_time` AND '.$_POST['end_time'].' < `end_time`';
    $result = mysql_query($check_date_time, $mysql)
                or die(mysql_error());
    

    任何帮助将不胜感激,我不知道我是否写错了查询或者数据库设置错误。

    谢谢,安德鲁

2 个答案:

答案 0 :(得分:1)

在我看来,您将日期和时间存储在text / varchar字段中,并尝试使用BETWEEN运算符,该运算符仅适用于日期/数字字段。

运行此查询:SHOW CREATE TABLE calendar_events;

并将结果发回给我们,以便我们可以看到您的表格结构。

另外我应该指出,在任何情况下,将$ _POST数据直接放入SQL查询都是非常非常糟糕的主意。这就是你如何暴露自己的SQL注入攻击并让你的整个数据库受到损害。

您应该使用辅助类或至少调用mysql_escape_string或在mysqli上使用每个数据元素的escape方法。此外,请确保使用单引号将参数包装在查询中。您还应该在反引号(`)中包装表/列名称。尽管它们在技术上是可选的,但它在读取查询时确实有帮助,并且它避免了数据/字段名冲突导致的错误。

例如,如果我发布“event_date”作为$ _POST ['event_date']的数据,那么MySQL会感到困惑,因为它会将查询的那部分解释为event_date = event_date当然将始终成为现实。

正确使用单引号和反引号:'event_date'= event_date现在,MySQL知道第一次出现的情况是告诉它查找event_date值存在于表的event_date列中的情况。 / p>

无论如何,回复表格结构,将您的单引号/反引号放在适当位置,我认为我们会更容易为您提供帮助。

答案 1 :(得分:0)

@Brian - 感谢您的提示,帮助和见解,这就是我以前的工作原理

$check_date_time = "SELECT * FROM calendar_events` WHERE id IN (SELECT id FROM  
calendar_events WHERE (event_date_start <= '$event_date_start' AND event_date_end >=   
'$event_date_start') OR (event_date_start <= '$event_date_end' AND event_date_end >=
'$event_date_end') OR (event_date_start >= '$event_date_start' AND event_date_end <=  
'$event_date_end'))"; $result = mysql_query($check_date_time, $mysql) or 
die(mysql_error()); 
if(mysql_num_rows($result) > 0) {} 

事件日期的开始和结束是我的数据库中的日期/时间列,我检查'id'(一行)是否符合任何条件,如果是这样,它会停止用户并显示一条说明有事件的通知在那个插槽中。但这确实允许每天发生一次以上的事件。