寻找一段时间是否可用

时间:2017-02-07 17:34:06

标签: php mysql date

我正在尝试预订系统而且我遇到了一个错误。 我有一个开始日期和结束日期,如果我输入一个日期开始结束,该结束日期已经使系统说不可能,但是如果我在已经占用的时间段之前和之后输入系统接受预订

这是我现在检查的方式

    `$db_check_result1 = mysql_query("SELECT * FROM ms_bookings WHERE ms_bookings_calid = '$propertyId' AND '$convertedstartdate' BETWEEN ms_bookings_startdate AND ms_bookings_enddate") or die(mysql_error());

如果结果大于0,那么预订日期是不可能的,我和出发日期一样

$db_check_result2 = mysql_query("SELECT * FROM ms_bookings WHERE ms_bookings_calid = '$propertyId' AND '$convertedenddate' BETWEEN ms_bookings_startdate AND ms_bookings_enddate") or die(mysql_error());
如果结果大于0则再次

,则无法预订

如果新请求属于已经输入的预订,但是当到达和离开日期在系统接受的现有日期之前和之后

,它可以正常工作

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

为了解决这个问题:

  • 不要在任何新代码中使用mysql_*函数。 mysql扩展已从当前的PHP版本中删除(从PHP 7.0开始)。使用mysqli(请注意" i")或pdo_mysql。
  • 不要将任何用户数据直接放入您的查询中。此导致未来的安全问题(SQL注入)。改为使用占位符。

那就是说,你想要的第三次检查是

SELECT * FROM ms_bookings
  WHERE ms_bookings_calid = :propertyId
    AND (ms_bookings_startdate BETWEEN :convertedstartdate AND :convertedenddate
         OR ms_bookings_enddate BETWEEN :convertedstartdate AND :convertedenddate)

但是,您可以将所有检查合并为一个更简单的查询:

SELECT * FROM ms_bookings
  WHERE ms_bookings_calid = :propertyId
    AND :convertedstartdate <= ms_bookings_enddate
    AND :convertedenddate >= ms_bookings_startdate

为了不重叠,新预订必须在现有预订结束后开始:convertedstartdate <= ms_bookings_enddate将为假),或者必须在之前结束 / em>现有预订开始(:convertedenddate >= ms_booking_startdate为假)。