Php 检查MySQL数据库表中是否有预订时段的最佳方法

Php 检查MySQL数据库表中是否有预订时段的最佳方法,php,mysql,database,pdo,Php,Mysql,Database,Pdo,我现在已经为我的预订系统准备好了数据库和表结构。我现在需要能够搜索,看看某辆车是否在一组日期内可用。我的表格结构是: 汽车表:(存储汽车信息) 预订表:(存储大多数信息-日期、id等) 预订表:(将汽车链接到预订) 使用PDO PHP,最好的搜索查询是什么,以确保只有可用日期显示为可预订,因为我需要确保不会获得重复的预订/日期。目前,我所能想到的就是在客户要求的日期搜索任何预订,如是,如果我得到任何结果,则意味着它不可用,否则我可以继续: $query_params = array( '

我现在已经为我的预订系统准备好了数据库和表结构。我现在需要能够搜索,看看某辆车是否在一组日期内可用。我的表格结构是:

汽车表:(存储汽车信息)

预订表:(存储大多数信息-日期、id等)

预订表:(将汽车链接到预订)

使用PDO PHP,最好的搜索查询是什么,以确保只有可用日期显示为可预订,因为我需要确保不会获得重复的预订/日期。目前,我所能想到的就是在客户要求的日期搜索任何预订,如是,如果我得到任何结果,则意味着它不可用,否则我可以继续:

$query_params = array( 
   ':start_search' => $_POST['user_selected_startdate'],
    ':end_search' => $_POST['user_selected_enddate'],
);

$query = " 
    SELECT 
        *
    FROM 
        booking_table
    WHERE 
        start_date BETWEEN :start_search AND :end_search AND
        end_date BETWEEN :start_search AND :end_search 
"; 

try { 
    $stmt = DB::get()->prepare($query); 
    $stmt->execute($query_params); 

    $rows = $stmt->fetchAll();
}  
catch(PDOException $ex) { 
    die("Failed to run query: " . $ex->getMessage()); 
} 

if(!$rows) {
    // booking is available, continue and pay
}
else {
    // booking is unavailable, try again
}

这是确保没有人在另一个插槽上预订的最佳过程和更安全的方法吗?

这与php或pdo完全无关。如何与数据库接口,或者使用哪种语言,都是无关紧要的。您只需要了解实际的SQL查询。无论主机语言/接口库如何,该值都将保持不变。您没有传递$query\u parms进行查询。您可以使用select count(1)而不是检索所有rows@CarlosGant我用SELECT count(1)替换了mySELECT*,即使在应该的时候也没有行,我需要修改代码中的其他内容吗?我非常感谢您对我的代码的帮助,但作为对前几条评论的回应,我只是想知道这是否是用于此类任务的最佳搜索查询,或者仅仅搜索不存在的行是否是最可靠的方法?请尝试
WHERE start_date>=:start_search AND end_date
booking_ID  | start_date | end_date
125674      | 2013-02-27 | 2013-03-01    
887463      | 2013-03-05 | 2013-03-07     
209930      | 2013-03-16 | 2013-03-22  
ID     | booking_ID | car_ID
1      | 125674     | 2
2      | 887463     | 2
3      | 209930     | 1
$query_params = array( 
   ':start_search' => $_POST['user_selected_startdate'],
    ':end_search' => $_POST['user_selected_enddate'],
);

$query = " 
    SELECT 
        *
    FROM 
        booking_table
    WHERE 
        start_date BETWEEN :start_search AND :end_search AND
        end_date BETWEEN :start_search AND :end_search 
"; 

try { 
    $stmt = DB::get()->prepare($query); 
    $stmt->execute($query_params); 

    $rows = $stmt->fetchAll();
}  
catch(PDOException $ex) { 
    die("Failed to run query: " . $ex->getMessage()); 
} 

if(!$rows) {
    // booking is available, continue and pay
}
else {
    // booking is unavailable, try again
}