繁体   English   中英

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

[英]PHP/SQL How can I make my query include results that has no records in another table yet?

我有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(已取消)的多个预订,因此,现在它仅过滤有关第一次预订的日期。

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

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

您可以使用,

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

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

这样,您可以获得无错误的结果。

nanjero05

与代码有关的几件事。 在第二个php代码中,您将对每个房间执行查询。 那样不好,因为它将生成许多对数据库的请求。

您还要求所有预订,然后在内存中过滤与房间相对应的预订。 那也不总是商品。 您在每个房间一次又一次地阅读所有预订。

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

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

(注意:请阅读有关SQL注入的信息以改善此问题)

然后,您知道如果$ result没有记录,则表示该房间没有预订。

为什么您需要多个查询,请尝试使用此简单的班轮

$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)  )";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM