Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zapytanie, czy poprawne?
slimy
post 27.04.2010, 23:28:43
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.09.2009

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


resFrom i resTo w bazie danych zawierają datę rezerwacji (od, do)
analogicznie zmienne $this->resFrom i $this->resTo zawierają również datę rezerwacji dla danego obiektu

Poblem: Zapytanie ma sprawdzić czy istnieją już jakieś rezerwacje w tym terminie - po prostu czy termin jest wolny i nie koliduje z innymi rezerwacjami. Jeżeli znajdzie jakąś rezerwację to zwróci dla niej resID i resztę zrobi już skrypt. Czy poniższe zapytanie bierze pod uwagę wszystkie możliwości? Czy przy jakichś warunkach brzegowych będzie działało nie prawidłowo?

  1. SELECT resID FROM Reservations
  2. WHERE (resFrom < '{$this->resFrom}' AND resTo > '{$this->resFrom}')
  3. OR (resFrom >= '{$this->resFrom}' AND resFrom <= '{$this->resTo}');
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
nospor
post 28.04.2010, 07:02:51
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Moze troche nie na temat, ale nie mogę zrozumiec Twojego zapytania. Mozesz mi slownie opisac kazdy z warunkow co robi oraz co robi kazda z grupy warunków (grupa - warunki w nawiasie). Albo może nie tyle co robi, ale co ty chcesz by robila.


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
slimy
post 28.04.2010, 09:06:43
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.09.2009

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


W bazie mam taką tabelę:

  1. CREATE TABLE Reservations
  2. (
  3. resID integer AUTO_INCREMENT PRIMARY KEY,
  4. resFrom timestamp,
  5. resTo timestamp
  6. )


I są w niej różne wpisy dotyczące rezerwacji: od jakiejś daty do jakiejś daty (godziny nie istotne).

W kodzie tworzony jest obiekt klasy 'Reservation', który ma zmienne resFrom i resTo odpowiadające nowej rezerwacji. Gdy na tym obiekcie dokonuje się metody save(), która odpowiada za zapis obiektu do bazy danych to muszę najpierw sprawdzić czy daty rezerwacji z bieżącego obiektu nie nakładają się na już zarezerwowane terminy. By to sprawdzić chcę pobrać z bazy resID tych rezerwacji, które termin podanym w obiekcie zarezerwowały wcześniej. (Jak zapytanie coś zwróci to znaczy, że termin jest zajęty). Jeszcze ważna rzecz, że jeżeli rezerwacja kończy się danego dnia to tego samego dnia może zacząć się następna.

Przykład
rezerwacja 1: 10.04.2010 do 16.04.2010
rezerwacja 2: 3.04.2010 do 10.04.2010
rezerwacja 3: 18.04.2010 do 25.04.2010

Jak widać rezerwacja 2 kończy się 10.04, a rezerwacja 1 zaczyna 10.04 i jest to w porządku. Teraz stworzony został obiekt z rezerwacją od 17.04.2010 - 20.04.2010, taki termin nie może zostać zarezerwowany, bo koliduje z inną rezerwacją (z rezerwacja 3). Na podstawie danych z obiektu pobieram z bazy kolidujące z nią terminy, jak coś zostanie pobrane to znaczy, że termin jest już zajęty, jak nie zwróci to wszystko jest ok.
Go to the top of the page
+Quote Post
Mchl
post 28.04.2010, 10:14:24
Post #4





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Start i koniec 'nowej' imprezy musi być przed startem, lub po zakończeniu imprez istniejących, tak więc jeśli początek lub koniec nowej imprezy wypada pomiędzy początkiem i końcem imprezy istniejącej, wówczas mamy kolizję.

Kod
WHERE
($this->resFrom > resFrom AND $this->resFrom < resTo)
OR
($this->resTo > resFrom AND $this->resTo < resTo)


Ten post edytował Mchl 28.04.2010, 10:14:46
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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 20:08