2016-06-01 76 views
1

我正在嘗試製作一個預訂頁面,該頁面會接受用戶輸入的入住和退房日期以及房間號碼。PHP - 如何檢查日期是否在兩個現有日期之間?

這是我目前的代碼;其當前功能是獲取所選房間號碼的所有預訂,並檢查其所有日期範圍,以查看當前預訂中的某個預訂與用戶輸入日期重疊。如果它重疊,則回顯錯誤,否則不做任何事情。 :

$sql18 = "SELECT rid, checkin, checkout FROM bookings 
    WHERE rid = $rNumber"; //$rNumber is room number obtained from a dropdown list 
$results18 = mysqli_query($conn, $sql18); 

while ($row = mysqli_fetch_array($results18)) { 
    if (('$cInDate' >= $row["checkin"] && '$cInDate' < $row["checkout"]) || //$cInDate and $cOutDate are user inputs 
     ('$cOutDate' > $row["checkin"] && '$cOutDate' <= $row["checkout"])) { 
     echo "invalid booking"; 
    } 
} 

我測試了if語句來觸發錯誤,沒有運氣。我仍然得到過去的if語句,沒有錯誤

+0

在查詢中使用'between'函數。 http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_between – chris85

+1

對於開始,您應該刪除$'cOutDate和$ cInDate中的',如果您使用它'$ cInDate '你將它比較爲一個字符串 – user1811893

+0

**警告**:當使用'mysqli'時,你應該使用[參數化查詢](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php )和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)將用戶數據添加到您的查詢中。 **不要**使用字符串插值或連接來完成此操作,因爲您創建了嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 **絕不**將'$ _POST'或'$ _GET'數據直接放入查詢中,如果有人試圖利用您的錯誤,這會非常有害。 – tadman

回答

0

而是在PHP比較,你可以做你的MySQL查詢。

$sql18 = "SELECT rid, checkin, checkout 
FROM bookings 
WHERE rid = $rNumber 
AND checkin <= '{$row['checkout']}' 
AND checkout => '{$row['checkin']}'"; 

正如你在兩個日期有兩個日期比較,你可以使用交叉比較,與checkout日期,且checkin日期checkout列與列checkin,如上面的查詢。

0

請嘗試執行以下查詢。我希望它會給你適當的記錄。 請檢查並讓我知道。

$sql18 = "SELECT rid,checkin,checkout 
FROM bookings WHERE 
rid = $rNumber 
AND checkin <='".$cInDate."' 
AND checkout >='".$cInDate."' 
AND checkin <='".$cOutDate."' 
AND checkout >'".$cOutDate."'"; //$rNumber is 

$results18 = mysqli_query($conn, $sql18); 
0

你爲什麼不函數之間只有你的SQL查詢中使用?

你的SQL查詢應該是這樣的

$sql18 = "SELECT 
rid, checkin, checkout 
FROM bookings 
WHERE rid = $rNumber AND 
(checkin BETWEEN $cInDate AND $cOutDate) AND 
(checkout BETWEEN $cInDate AND $cOutDate)"; 

這是否存在由特定的時間任何預訂將返回。

避免在SQL查詢中使用普通的PHP變量,它會導致SQL注入問題。

+0

不幸的是這並沒有工作 –

+0

嘗試回顯'$ sql18'並在你的mysql客戶端運行相同的查詢字符串,你是否看到任何錯誤? –

0

嘗試此查詢,在查詢本身,我們可以找到一個特定的房間預訂的有效性..

SELECT A.*,(CASE WHEN A.checkin >= '$cInDate' && A.checkin <= '$cOutDate' 
&& A.checkout >= '$cInDate' && A.checkout <= '$cOutDate' THEN 'Valid' ELSE 'Invalid' END) 
AS Roomstatus FROM booking A WHERE A.rid='$rNumber' 
0

你所做的一切都是正確的nanjero。唯一的條件是如果條件你使用單引號變量,所以它會認爲是字符串,所以只有它不工作。它檢查了它正在工作的一些靜態數據。請通過以下代碼。

$cInDate = '2016-11-03'; 
$cOutDate = '2016-11-08'; 
$rNumber = 'G01'; 

$sql18 = "SELECT rid, checkin, checkout FROM bookings 
    WHERE rid = '$rNumber'"; //$rNumber is room number obtained from a dropdown list 
$results18 = mysqli_query($con, $sql18); 

while ($row = mysqli_fetch_array($results18)) { 
    if (($cInDate >= $row["checkin"] && $cInDate <= $row["checkout"]) || //$cInDate and $cOutDate are user inputs 
     ($cOutDate > $row["checkin"] && $cOutDate <= $row["checkout"])) { 
     echo "invalid booking"; 
    } 
} 

即使它正在工作。更好的是你可以用strtotime函數進行比較。任何疑問都會評論我。

相關問題