检查资源预留可用性

时间:2014-10-06 09:07:03

标签: php mysql codeigniter-2

我有下表:

id | rsvp_date | return_date | user_id | car_id

其中ID是PK,rsvp_date& return_date是DATETIME,user_id& car_id分别是用户表和汽车表的FK。

我想要做的是每次用户想要预订时进行检查。检查的查询归结为此(此查询由函数checkAvailability()调用:

SELECT id
FROM `car_reservation`
WHERE ('2014-10-06 07:00:00' BETWEEN rsvp_date AND return_date)
AND car_id = 5;

我提到的功能:

function checkAvailability($datetime, $id = null){
    $sql = "SELECT id
            FROM `car_reservation`
            WHERE ('".$datetime."' BETWEEN rsvp_date AND return_date)
            AND car_id = ".$id;

    $query = $this->db->query($sql);
    // echo "<pre>"; print_r($this->db->last_query());die();        
    if($query->num_rows() > 0){
        return FALSE;
    }else{
        return TRUE;
    }
}

将给定日期与rsvp_date和return_date列匹配。日期取自表格中的字段(有2个字段;开始日期和返回日期)。

当前代码无法正常工作。例如:

  • 嘉宾#1:预订车A 2014-10-06 07:00:00至2014-10-06 10:00:00 [有效]
  • 嘉宾#2:2014-10-06 07:00:00之间预订车B. 至2014-10-06 10:00:00 [有效]
  • 嘉宾#3:预订Car A之间 2014-10-06 08:00:00至2014-10-06 11:30:00 [不可用,由于开始 时间不可用]
  • 嘉宾#4:2014-10-06 06:00:00到2014-10-06之间预订车B. 14:00:00 [有效,但不是假设。来自Guest#2已经 在07:00:00 - 10:00:00之间预订了车。

任何人都可以帮助我如何改进我的代码,以便在所请求的预订之间已经预订时,最后一个条件将返回False吗?

PS:我发现这篇文章但很难理解它,我正在寻找类似的方法,只是更简单。 http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

编辑:

这张图片可视化一切,我想现在我只需要实现每个列标题上指定的功能(带有复选标记的那些)。

enter image description here

1 个答案:

答案 0 :(得分:2)

根据这个SO question,您必须检查不同的内容:

$query = "
    SELECT id
    FROM `car_reservation`
    WHERE (
        '".$datetimeStart."' <= return_date 
        AND 
        '".$datetimeEnd."' >= rsvp_date 
    ) AND car_id = ".$id
";

请参阅SQL小提琴:http://sqlfiddle.com/#!2/d818c/1

$datetimeStart测试用例场景开始,2014-10-06 06:00:00$datetimeEnd2014-10-06 14:00:00Guest #4

如果使用可能包含用户输入的变量来连接SQL查询,请注意SQL注入。