2017-03-25 5 views
-1

私のデータベースには2つのテーブルがあります。最初のテーブルはroom_detailsで、2番目のテーブルはbooking_detailsです。チェックインとチェックアウトの間の客室の空き状況を確認するためのsqlクエリ

room_detailsテーブル:

Room_Id | Category | Type | Price 
---------|------------|----------|--------- 
R 001 | DELUXE | NON-AC | 2500 
     |   |   | 
R 002 | DELUXE | AC  | 3500 
     |   |   | 
R 003 | GRAND | NON-AC | 4500 
     |   |   | 
R 004 | GRAND | AC  | 5500 
     |   |   | 
R 005 | SUITE | NON-AC | 6500 
     |   |   | 
R 006 | SUITE | AC  | 7500 

booking_detailsテーブル:

Room_Id | Booking_Id | Booking_Date | Check_in_Date | Check_out_Date 
----------|--------------|----------------|---------------|----------------- 
    R 001 | B 001  | 2017-03-25 | 2017-03-26 | 2017-03-28 
      |    |    |    | 
    R 001 | B 002  | 2017-03-25 | 2017-03-29 | 2017-04-01 
      |    |    |    | 
    R 004 | B 003  | 2017-03-25 | 2017-03-26 | 2017-03-30 
      |    |    |    | 
    R 005 | B 004  | 2017-03-25 | 2017-03-26 | 2017-03-28 

問合せ:

$sql = 'SELECT * FROM room_details 
     WHERE room_id NOT IN(
       SELECT room_id FROM booking_details 
       WHERE '$check_in' BETWEEN Check_in_Date AND Check_out_Date 
       OR '$check_out' BETWEEN Check_in_Date AND Check_out_Date 
     )'; 

私はすべてを表示するには、PHPを使用して、ユーザからの入力としてcheck_inとcheck_out日付を取ります利用可能な部屋は、次に示すようにエラーを表示します。

Parse error: syntax error, unexpected '$check_in' (T_VARIABLE)

このクエリで何が問題になっていますか?

これは完全なPHPコードです:あなたは二重引用符で.

$sql = 'SELECT * FROM room_details WHERE room_id NOT IN(SELECT room_id FROM booking_details WHERE "'.$check_in.'" BETWEEN Check_in_Date AND Check_out_Date OR "'.$check_out.'" BETWEEN Check_in_Date AND Check_out_Date)'; 

を使用して文字列を連結する必要があり、単一引用符で

<?php 

    $a = $_POST["data_1"]; 
    $b = $_POST["data_2"]; 

    $check_in = date("Y-m-d", strtotime($a)); 
    $check_out = date("Y-m-d", strtotime($b)); 

    $dbhost = "localhost:3306"; 
    $dbuser = "root"; 
    $dbpass = ""; 
    $dbname="hotel"; 

    //create connection 
    $conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 

    //check connection 
    if($conn->connect_error) { 
    die("Connection failed:" . $conn->connect_error); 
    } 

    $sql = 'SELECT * FROM room_details 
      WHERE room_id NOT IN(
      SELECT room_id FROM booking_details 
      WHERE '$check_in' BETWEEN Check_in_Date AND Check_out_Date 
       OR '$check_out' BETWEEN Check_in_Date AND Check_out_Date 
      )'; 

    $result = $conn->query($sql); 

if ($result->num_rows > 0) { 
    echo "<table border=1> 
      <tr> 
      <th>Room_Id</th> 
      <th>Category</th> 
      <th>Type</th> 
      <th>Price</th> 
      </tr>"; 

    // output data of each row 
    while($row = $result->fetch_assoc()) { 
    echo "<tr>"; 
    echo "<td>" . $row['Room_Id'] . "</td>"; 
    echo "<td>" . $row['Category'] . "</td>"; 
    echo "<td>" . $row['Type'] . "</td>"; 
    echo "<td>" . $row['Price'] . "</td>"; 
    echo "<td>" . "<a href = room_booking.php> BOOK NOW </a>" . "</td>"; 
    echo "</tr>"; 
    } 
    echo "</table>"; 
} else { 
    echo "Error:" . $sql . "<br>" . $conn->error; 
} 
$conn->close(); 
?> 
+0

正確なPHPコードを表示してください: – court3nay

+0

引用符、引用符、引用符、ペアでそれらを保持し、それらをうまくリンクします。そうでなければ無効になります。 – RST

+0

http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Lucero

答えて

0

、あなたは$check_in$check_outインライン

を注入することができます
$sql = "SELECT * FROM room_details WHERE room_id NOT IN(SELECT room_id FROM booking_details WHERE '$check_in' BETWEEN Check_in_Date AND Check_out_Date OR '$check_out' BETWEEN Check_in_Date AND Check_out_Date)"; 

読みやすくするため、私はsprintfを好む。

$sql = sprintf('SELECT * FROM room_details WHERE room_id NOT IN(SELECT room_id FROM booking_details WHERE "%s" BETWEEN Check_in_Date AND Check_out_Date OR "%s" BETWEEN Check_in_Date AND Check_out_Date)', $check_in, $check_out); 

実際には(セキュリティ面では)PDOを使用してパラメータをバインドする必要があります。 http://php.net/manual/en/pdostatement.bindparam.php

$stmt = $db->prepare('SELECT * FROM room_details WHERE room_id NOT IN(SELECT room_id FROM booking_details WHERE :check_in BETWEEN Check_in_Date AND Check_out_Date OR :check_out BETWEEN Check_in_Date AND Check_out_Date)'); 
$stmt->bindParam(':check_in', $check_in, PDO::PARAM_STR); 
$stmt->bindParam(':check_out', $check_out, PDO::PARAM_STR); 
$stmt->execute(); 
0

私は、問題は、文字列の連結のだと思うので、のようなあなたのクエリを変更:この文字列で検索してください

$sql = "SELECT * FROM room_details WHERE room_id NOT IN(SELECT room_id FROM booking_details WHERE "'.$check_in.'" BETWEEN Check_in_Date AND Check_out_Date OR "'.$check_out.'" BETWEEN Check_in_Date AND Check_out_Date)"; 

+0

クエリを置き換えた後、私はパーズエラーを受け取ります:構文エラー、予期しない ''。$ check_in。 ' '(T_CONSTANT_ENCAPSED_STRING) – Neha

+0

'$ check_in'に値がありますか?回答が間違っているため –

+0

$ check_in。 '' 'ではなく、' "'でなければなりません。$ check_in。'" ' – Gravy

関連する問題