我在資料庫中有 2 個表:
apartaments: id_apartmana
reservations: id_rezervacije, check_in, check_out
當用戶輸入 2 個日期(游客的到達和離開)時,如何構造一個查詢,它會顯示該時期的可用公寓?我有if宣告沒有做它應該做的事情:
<?php
include_once 'database.php';
$check_in = $_POST['datum1'];
$check_out = $_POST['datum2'];
$result = mysqli_query($conn,"SELECT check_in, check_out, id_apartmana FROM rezervacije");
while($row=mysqli_fetch_array($result))
{
if ($_POST['datum1'] < $row['check_in'] && $_POST['datum2'] <= $row['check_in'] or $_POST['datum1'] >= $row['check_out'] && $_POST['datum2'] >= $row['check_out']){
echo $row['id_apartmana'];
} else {
echo"Apartman nije slobodan :(";
break;
}
}
mysqli_close($conn);
?>
uj5u.com熱心網友回復:
由于您沒有包含足夠的資訊,因此無法確定為什么您的 PHP 代碼沒有按預期作業。有兩個明顯的潛在問題——
- 也許通過 POST 收到的日期格式不正確(需要是 yyyy-mm-dd)來執行有意義的比較。
- 您的 AND 和 OR 組合需要括號 - (condition1 && condition2) or (condition3 && condition4) or (condition5 && condition6)
即使解決了上述問題,您當前的代碼仍然無法提供您正在尋找的結果,因為它正在單獨查看預訂。
在您的 SQL 中進行這些檢查會更有效率 -
SET @start = DATE(20220108);
SET @end = DATE(20220115);
SELECT * FROM apartmana WHERE NOT EXISTS (
SELECT *
FROM rezervacije
WHERE rezervacije.id_apartmana = apartmana.id_apartmana AND (
(check_in < @start AND check_out > @start) OR
(check_in < @end AND check_out > @end) OR
(check_in > @start AND check_out < @end)
)
);
這是一個db<>fiddle
顯然,您將使用準備好的陳述句,而不是使用 SQL 變數。
<?php
include_once 'database.php';
$sql = '
SELECT * FROM apartmana WHERE NOT EXISTS (
SELECT *
FROM rezervacije
WHERE rezervacije.id_apartmana = apartmana.id_apartmana AND (
(check_in < ? AND check_out > ?) OR
(check_in < ? AND check_out > ?) OR
(check_in > ? AND check_out < ?)
)
)';
/* create a prepared statement */
$stmt = $conn->prepare($sql);
/* bind parameters for markers */
$stmt->bind_param('ssssss', $check_in, $check_in, $check_out, $check_out, $check_in, $check_out);
$check_in = $_POST['datum1'];
$check_out = $_POST['datum2'];
/* execute query */
$stmt->execute();
$result = $stmt->get_result();
while($row = $result->fetch_array()) {
// do something
}
uj5u.com熱心網友回復:
如果您檢查所選日期的預訂并從所有房間串列中減去這些房間會怎樣?
SELECT id_rezervacije FROM reservations WHERE check_in BETWEEN date('datum1') AND date('datum2') AND check_out BETWEEN date('datum1') AND date('datum2');
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/401819.html
上一篇:如何在MYSQL視圖中使用遞回
