PHP / SQL如何使我的查询包含在另一个表中没有记录的结果?

时间:2016-05-28 11:34:28

标签: php mysql sql

我有2个PHP代码执行房间搜索。用户指定号码。床,入住日期和退房日期。第一个代码检索所有具有相应床位数的房间。第二个代码检查房间是否有现有预订,如果有,并且预订日期与房间显示的用户输入日期不冲突,如果没有现有预订则只显示。

我的第一个PHP代码:

$sql = "SELECT rooms.rid, beds, orientation, price FROM rooms
        WHERE (beds = $nOfBeds)";
if ($rOrientation != "") {
$sql .= " AND orientation = '$rOrientation'";
}

$results = mysqli_query($conn, $sql)
or die ('Problem with query' . mysqli_error($conn));

我的第二个PHP代码:

<?php
    while ($row = mysqli_fetch_array($results)) { 

    $sql2 = "SELECT rid, checkin, checkout FROM bookings";

    $results2 = mysqli_query($conn, $sql2)
    or die ('Problem with query' . mysqli_error($conn));

    $row2 = mysqli_fetch_array($results2);

    if ($row["rid"] == $row2["rid"]) {
        if (($cInDate < $row2["checkin"] && $cOutDate <= $row2["checkin"]) ||
           (($cInDate >= $row2["checkout"] && $cOutDate > $row2["checkout"]))) {
?>
            <tr>
                <td><?php echo $row["rid"]?></td>
                <td><?php echo $row["beds"]?></td>
                <td><?php echo $row["orientation"]?></td>
                <td><?php echo $row["price"]?></td>
            </tr>
    <?php }
    } 
    } ?>

目前它正在过滤冲突日期,但它也过滤掉了没有现有预订的房间。我遇到这个代码的另一个问题是它似乎不适用于具有相同房间ID(rid)的多个预订,所以现在它只是过滤关于第一次预订的日期。

这是我的预订表:http://imgur.com/DGOko1f

这是房间表:http://imgur.com/ED5KFES

3 个答案:

答案 0 :(得分:0)

你可以使用,

if($result != NULL) {
   // Execute code
} else {
   // Give NULL values or error
}

其他方式是if(count($result) > 0)

这样您就可以获得无错结果。

答案 1 :(得分:0)

nanjero05

代码有几个方面。在第二个PHP代码中,您将按每个房间执行查询。这不太好,因为它会向数据库生成许多请求。

此外,您正在请求所有预订,然后在内存中过滤与房间相对应的预订。它也不总是货物。您每个房间都会一次又一次地阅读所有预订。

一种解决方案是在第二个查询(第二个PHP代码)中添加一个条件,仅选择当前房间的预订。

 $rid = $row["rid"]
 $sql2 = "SELECT rid, checkin, checkout FROM bookings where rid = $rid";

(注意:阅读有关SQL注入以改进此内容)

然后你知道如果$ result没有记录,那么房间里就没有预订。

答案 2 :(得分:0)

为什么你需要多个查询尝试这个简单的一行

$sql = "SELECT rooms.rid, beds, orientation, price FROM rooms 
    WHERE beds = $nOfBeds AND rid NOT IN (SELECT bookings.rid FROM bookings WHERE user_checkin between checkin and checkout or ('user_checkin <= checkin AND user_checkout >= checkout)  )";