所以我在一个客户网站上工作,它包括一个事件日历作为其主要焦点。日历功能:您可以插入带有日期、开始时间、结束时间的事件。然后它显示在日历上,你就得到了照片。我遇到的问题是当前事件与人们试图预订为新事件的事件之间存在冲突。我知道逻辑上我需要检查它是否:
- 事件之间
- 在事件期间但在事件之前开始
- 在事件期间,但在事件期间开始并在事件结束后结束。
我开始编写的 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());
任何帮助将不胜感激,我不知道是我写错了查询还是数据库设置错误。
谢谢安德鲁
最佳答案
在我看来,您正在将日期和时间存储在 text/varchar 字段中,并尝试使用仅适用于日期/数字字段的 BETWEEN 运算符。
运行此查询:SHOW CREATE TABLE calendar_events
;
然后为我们发回结果,以便我们可以看到您的表结构。
我还应该指出,在任何情况下,将 $_POST 数据直接放入 SQL 查询中都是一个非常非常非常糟糕的主意。这就是您如何让自己暴露于 SQL 注入(inject)攻击并使您的整个数据库受到损害。
您应该使用辅助类或至少调用 mysql_escape_string 或在 mysqli 上围绕每个数据元素使用转义方法。另外,请确保将查询中的参数用单引号引起来。您还应该用反引号 (`) 包裹您的表/列名称。尽管它们在技术上是可选的,但它在读取查询时确实有帮助,并且避免了由数据/字段名冲突引起的错误。
例如,如果我发布“event_date”作为 $_POST['event_date'] 的数据,MySQL 会感到困惑,因为它将查询的那部分解释为 event_date
= event_date
这当然总是为真。
正确使用单引号和反引号:'event_date' = event_date
现在 MySQL 知道第一次出现是告诉它查找 event_date 的值出现在表。
无论如何,发回表格结构,将单引号/反引号放在适当的位置,我认为我们可以更轻松地帮助您。
关于php - 与 MYSQL 和 PHP 事件日历的事件冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9256776/