2008-11-25 4 views
1

Я застрял в попытке решить эту проблему в течение нескольких дней. Я даже сдаюсь на некоторое время, и, поскольку я новичок в PHP, мне нужна помощь.Помощь по SQL-запросам

Это моя проблема: У меня есть запрос, который выбирает всю соответствующую запись в таблице «отели», а затем для каждого отеля ищет забронированный номер определенного типа в «забронированных комнатах» за столом и все это на определенный период. Итак, сначала я вывожу все hotel_ids из «hotel_table», исходя из местоположения, предоставленного в форме поиска, и для каждого hotel_id я прохожу через таблицу «забронированные комнаты».

Вот код:

if(isset($_GET['book'])){ 
$sql=mysql_query("SELECT hotel_id FROM 'hotels' WHERE city='$city") or die(mysql_error()); 
while($row=mysql_fetch_array($sql)){ 
    $sql_2=mysql_query("SELECT * FROM `booked_rooms` WHERE hotel_id='$hotel_id' 
    AND arrival_date BETWEEN '$arrival_date' AND '$departure_date' 
    OR departure_date BETWEEN '$arrival_date' AND '$departure_date'") 
or die(mysql_error()); 
} 

while($row_2=mysql_fetch_array($sql_2)){ 
    print_r($row_2); 
} 

} 
// $city, $arrival_date and $departure date are values retrieved from the search form 

Проблема заключается в том, что я получаю петлю через стол «отель» и получить все hotel_ids соответствующего мест, но не получил ничего с печатью массива $ row_2. Я попытался использовать JOINS в цикле SQL, foreach, но не повезло. Я знаю, что это тривиальные вопросы, но я все еще участвую, поэтому любой отзыв приветствуется. Спасибо заранее.

ответ

5

Не зная PHP, можете ли вы сделать это в одном запросе?

SELECT booked_rooms.*, hotels.* FROM 'hotels' 
JOIN 'booked_rooms' ON hotels.hotel_id = booked_rooms.hotel_id 
WHERE 
    hotels.city='$city" AND 
    (
    booked_rooms.arrival_date BETWEEN '$arrival_date' AND '$departure_date' OR 
    booked_rooms.departure_date BETWEEN '$arrival_date' AND '$departure_date') 

Проверить «» кавычки вокруг ваших таблиц, необходимых для PHP строк и т.д. ...

1

Прежде всего, у Вас есть ошибка в вашем SQL первой в том, что вы не котируется ваш CITYNAME должным образом. Затем вы не получите hotel_id из набора результатов. И тогда у вас есть вторая петля в неправильном месте.

Попробуйте следующее:

if(isset($_GET['book'])) { 
    $sql = mysql_query("SELECT hotel_id FROM 'hotels' WHERE city='".mysql_real_escape_string($city)."'") or die(mysql_error()); 

    $arrival_date = mysql_real_escape_string($arrival_date); 
    $departure_date = mysql_real_escape_string($departure_date); 
    while($row = mysql_fetch_assoc($sql)) { 
     $hotel_id = $row['hotel_id']; 
     $sql_2 = mysql_query("SELECT * 
      FROM `booked_rooms` 
      WHERE hotel_id = ".$hotel_id." 
       AND (
        arrival_date BETWEEN '".$arrival_date."' AND '".$departure_date."' 
        OR departure_date BETWEEN '".$arrival_date."' AND '".$departure_date."' 
       )") 
     or die(mysql_error()); 

     while($row_2 = mysql_fetch_assoc($sql_2)) { 
      print_r($row_2); 
     } 
    } 

} 

// $city, $arrival_date and $departure date are values retrieved from the search form 

Я также рекомендую быть более щедрым в вашем пробельных. Это упрощает чтение PHP.

+0

Вам не нужны скобки вокруг второго раздела вашего предложения where? В противном случае приоритет этих предикатов не ясен ...? – Codewerks 2008-11-25 03:30:49

+0

Dang. Да, ты прав. Я хотел добавить их, но отвлекся. Это фиксированная. – staticsan 2008-11-25 05:06:39

1

Пожалуйста, не ставьте строковые SQL-запросы извне, недоверенные данные. Это проблема Bobby Tables.

Для получения подробной информации об использовании параметризованных утверждений см. Страницу, например this one.