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

Zaloguj się, aby skomentować

Będziesz mógł dodać komentarz po zalogowaniu się



Zaloguj się
Zaloguj się, aby obserwować  

×