Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rezerwowanie pokoi hotelowych
Forum PHP.pl > Forum > Bazy danych > MySQL
Adi32
Witam.

Posiadam dwie tabele:

pokoj -> id | max_liczba_osob | nazwa | status
rezerwacja -> id | id_pokoju | data_od | data_do | klient | status

Klient chcąc zarezerwować pokój najpierw wybiera zakres czasu jaki chciałby spędzić w hotelu i ile będzie osób.

Potem skrypt ma wyświetlić pokoje dostępne w tym terminie i dla podanej ilości osób.

Jak napisać zapytanie SQL które sprawdzi wszystkie rezerwacje dotyczące danego pokoju i czy aktualny zakres dat nie koliduje z którąś wcześniejszą rezerwacją?

Mam wrażenie, że rozwiązanie jest dziecinnie proste ale nic nie mogę wymyślić...

Rozwiązałem problem.

  1. $db->query("SELECT
  2. p.id
  3. FROM
  4. pokoj p
  5. WHERE
  6. p.osob>=".$_SESSION['osob']." AND
  7. p.id NOT IN (SELECT r.id_pokoj FROM rezerwacja r WHERE p.id=r.id_pokoj AND data_od BETWEEN '".$_SESSION['data_od']."' AND '".$_SESSION['data_do']."') AND
  8. p.id NOT IN (SELECT r.id_pokoj FROM rezerwacja r WHERE p.id=r.id_pokoj AND data_do BETWEEN '".$_SESSION['data_od']."' AND '".$_SESSION['data_do']."') AND
  9. p.id NOT IN (SELECT r.id_pokoj FROM rezerwacja r WHERE p.id=r.id_pokoj AND data_od <= '".$_SESSION['data_od']."' AND data_do >= '".$_SESSION['data_od']."')
  10. ");


Pozdrawaim.
zawodnik
SELECT * FROM baza WHERE data='data_z_zapytania_klienta'

Jeśli zwróci więcej niż zero wierszy to znaczy że data jest zajęta. Możesz to rozbudować.

Uwaga!

$result = mysql_query('SELECT * FROM baza WHERE data='data_z_zapytania_klienta'', $connect);
if(!$result){
echo 'data wolna';
}
else{
echo 'data zajęta';
}

Zawsze zwróci zajęta, ponieważ SELECT nigdy nie zwraca FALSE. Trzeba to sprawdzić za pomocą mysql_num_rows($result)
erix
A po kiego grzyba za każdym razem liczyć?

Dobrą praktyką jest wykorzystwanie mysql_fetch_array w takim warunku. Sprawdzenie result zwraca, czy wykonanie zapytania się (nie) powiodło.
Adi32
Zdaje mi się, że Panowie nie zrozumieli zagadnienia. Chodzi o przedział(y) z zakresu dat, dla wszystkich pokoi przy czym dla każdego pokoju może być wiele rezerwacji, a nie o jeden dzień.

Tak wygląda zapytanie po małych przeróbkach:

  1. $db->query("SELECT
  2. p.*
  3. FROM
  4. pokoj p
  5. WHERE
  6. p.osob>=".$_SESSION['osob']." AND
  7. p.id NOT IN (SELECT r.id_pokoj FROM rezerwacja r WHERE p.id=r.id_pokoj AND data_od BETWEEN '".$_SESSION['data_od']."' AND '".$_SESSION['data_do']."') AND
  8. p.id NOT IN (SELECT r.id_pokoj FROM rezerwacja r WHERE p.id=r.id_pokoj AND data_do BETWEEN '".$_SESSION['data_od']."' AND '".$_SESSION['data_do']."') AND
  9. p.id NOT IN (SELECT r.id_pokoj FROM rezerwacja r WHERE p.id=r.id_pokoj AND data_od <= '".$_SESSION['data_od']."' AND data_do >= '".$_SESSION['data_od']."')
  10. ");


i działa dobrze. Dziękuję za zainteresowanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.