Skocz do zawartości
Zaloguj się, aby obserwować  
maxell2k11

Zapytanie SQL

Polecane posty

Witam wszystkich,

 

mam sobię tabelę Mysql:

 

pola: przyjazd (DATE) i wyjazd (DATE)

 

Przykładowe dane:

 

przyjazd: 2012-10-22 DO wyjazd: 2012-10-27

przyjazd: 2012-10-27 DO wyjazd: 2012-11-03

przyjazd: 2012-11-03 DO wyjazd: 2012-11-17

 

I teraz chodzi o to jak sprawdzać aby nie zarezerwować nowego terminu

który by się kolidował z już dodanym ?

 

ma ktoś jakieś fajne zapytanie ?

 

SELECT * FROM `terminy_rezerwacji` where

(DATE_FORMAT(arrival_date, '%Y-%m-%d') >= '$date_end' AND DATE_FORMAT(departure_date, '%Y-%m-%d') <= '$date_start'))

 

Mam coś takiego ale nie zabezpieczy mnie to przed wszysktimi kombinacjami...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Takie rozwiązanie na szybko:

 

Sprawdź:

SELECT count(*) FROM terminy_rezerwacji WHERE ((('$s1' BETWEEN arrival_date AND departure_date) AND '$s1' <> departure_date) or (('$s2' BETWEEN arrival_date AND departure_date) AND '$s2' <> arrival_date))

 

Jeśli count() zwróci >1 rekord nie dodajesz rezerwacji - w przeciwnym wypadku dodajesz.

 

Zamienne $s1 - data przyjazdu nowej rezerwacji, $s2 - data wyjazdu nowej rezerwacji.

 

Można zamknąć to wszystko w jedno zapytanie (z insertem od razu) jakbyś chciał to zapraszam do kontaktu.

 

Napisałem to wyobrażając sobie bazę na szybko i nie wykluczam iż może być w tym jakiś błąd.

Zapraszam w razie czego do kontaktu online gg: 5236547 :)

 

Pozdrawiam

Edytowano przez www.gamebit.pl (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zakłądając, że dobrze zrozumiałem intencje:

 

SELECT COUNT( id )
FROM `terminy`
WHERE (
arrival_date < '2012-11-23'
AND departure_date > '2012-11-23'
)
OR (
arrival_date < '2012-12-08'
AND departure_date > '2012-12-08'
)

 

gdzie:

2012-11-23 - data planowanego przyjazdu

2012-12-08 - data planowanego wyjazdu

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jeśli chcesz sprawdzić czy podany przedział jest już zablowowany to:

 

$date_start; /* data przyjazdu */
$date_end; /* data wyjazdu */

SELECT * FROM terminy_rezerwacji
WHERE $date_end > arrival_date
AND departure_date > $date_start;

 

powinno Ci podać wszystkie przedziały czasowe, które już są w bazie i kolidują z nowym terminem.

Więc jeśli to zapytanie zwróci ci jakiś rekord, to znaczy że pokój w wybranym terminie jest już zajęty.

Jeśli nie dostaniesz żadnych rekordów, to termin jest wolny.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Poprawka:

 

SELECT count(*) FROM terminy_rezerwacji WHERE ((('$s1' BETWEEN arrival_date AND departure_date) AND '$s1' <> departure_date) or (('$s2' BETWEEN arrival_date AND departure_date) AND '$s2' <> arrival_date) or (('$s1' < arrival_date) AND ('$s2' > departure_date)))

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ja bym pokombinował tak.

W zmiennej date dajesz tą date która zarezerwował.

Np. z formularza odbierasz: "addslashes(htmlspecialchars($_POST['data']));"

 

 

 

$zapytanie = mysql_query("SELECT * from tabela WHERE date='$date'");

 

i teraz liczysz czy już jest

 

if(mysql_num_rows($zapytanie) = 0) {
//Rezerwujemy
} else {
echo 'Przepraszamy, ale data juz jest zarezerwowana';
}


Edytowano przez GeoAce (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

if(mysql_num_rows($zapytanie) = 0) {
...

 

PHP to nie MySQL. Operatory identyczności zaczynają się od dwóch "=".

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Ja bym pokombinował tak.

W zmiennej date dajesz tą date która zarezerwował.

Np. z formularza odbierasz: "addslashes(htmlspecialchars($_POST['data']));"

 

 

 

$zapytanie = mysql_query("SELECT * from tabela WHERE date='$date'");

 

i teraz liczysz czy już jest

 

if(mysql_num_rows($zapytanie) = 0) {
//Rezerwujemy
} else {
echo 'Przepraszamy, ale data juz jest zarezerwowana';
}


 

Nie wiem co cię naszło na odgrzewanie starych kotletów na forum ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×