簡體   English   中英

在酒店預訂系統上工作時,我卡在了檢查可用房間上

[英]working on hotel reservation system and I get stuck on check avaibility room

有我的數據庫結構:

  1. 房間:roomId-roomName-roomCapacity
  2. 預約:rsId-rsroomId-date_in-date_out

我想創建一個搜索 function 來搜索可用房間。 我無法獲得那些天沒有預訂的可用的。 我已經嘗試了很多東西,但直到現在還無法解決這個問題。 有我的最新代碼:

function search ($name, $date_in, $date_out) {
    $this->db->select('*')->from('Rooms');
    $this->db->join('Reservation', 'rooms.roomid = reservation.rsroomId', 'LEFT');
    $this->db->like('date_in', $date_in);
    $this->db->like('date_out', $date_out);
    $this->db->like('roomName', $name);
    return $this->db->get()->result_array();
}

謝謝你

我不太熟悉 CodeIgniter 構建查詢的方式,但我了解您想要實現的目標。 原始查詢看起來像這樣:

SELECT  Rooms.*
FROM    Rooms
        LEFT JOIN Reservation
            ON Rooms.roomId = Reservation.rsroomId
                AND date_in < '$date_out' AND date_out > '$date_in'
WHERE   rsId IS NULL;

對於 select JOIN ON條件中的所有重疊預訂,您必須將現有預訂的date_in與所需預訂的$date_out進行比較,反之亦然。 如果現有預訂在您要入住之前退房,則不會重疊。 如果現有預訂在您要退房后入住,則不會重疊。

在精心設計這些JOIN ON條件以獲得重疊預訂后, WHERE rsId IS NULL條件可確保您僅獲得不存在此類現有重疊預訂的房間。

最后一部分在 CodeIgniter 中很容易,但是將所有三個JOIN ON條件都放入$this->db->join()會很麻煩。 like()where()函數會自動轉義您的值,但在這里您需要手動添加此保護以防止 SQL 注入。 也許是這樣的:

function search ($date_in, $date_out) {
    // Ensuring these values are safe in raw SQL:
    $date_in = $this->db->escape($date_in);
    $date_out = $this->db->escape($date_out);
    
    $joinCondition = 'rooms.roomid = reservation.rsroomId';
    $joinCondition .= " AND date_in < $date_out AND date_out > $date_in";
    
    $this->db->select('*')->from('Rooms');
    $this->db->join('Reservation', $joinCondition, 'LEFT');
    $this->db->where('rsId', NULL);
    return $this->db->get()->result_array();
}

另一種方法是在原始查詢中加上問號,這樣 CodeIgniter 就可以通過查詢綁定轉義您的值:

function search ($date_in, $date_out) {
    $sql = "SELECT  Rooms.*
            FROM    Rooms
                    LEFT JOIN Reservation
                        ON Rooms.roomId = Reservation.rsroomId
                            AND date_in < ? AND date_out > ?
            WHERE   rsId IS NULL";
    $binds = [$date_out, $date_in];
    return $this->db->query($sql, $binds)->result_array();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM