[英]working on hotel reservation system and I get stuck on check avaibility room
有我的數據庫結構:
我想創建一個搜索 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.