Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rezerwowanie pokoi hotelowych, SQL pobierający pokoje wg. dostępności
Adi32
post
Post #1





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
zawodnik
post
Post #2





Grupa: Zarejestrowani
Postów: 44
Pomógł: 1
Dołączył: 4.06.2011

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Adi32
post
Post #4





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Adi32 29.06.2011, 14:57:50


--------------------
Wolałem języki z rodziny C ale poszedłem na łatwizne...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 04:25