ugrás a tartalomhoz

Lefoglaló oldal keszitése

WestPal · 2009. Jan. 12. (H), 21.46
Üdv mindenkinek!

Kissebb problémába ütköztem, egy online panzió-hotel szobalefoglaló oldalt kell elkészitenem.

Php tudással nincs probléma, a gond az, hogy hogyan tudnám felépíteni az adatbázist úgy, hogy minden szobát adott dátum intervallumra le lehessen foglalni, és le lehessen azt ellenőrizni php-val hogy az adott szoba lefoglalható-e bizonyos dátumon és nincs véletlenül már lefoglalva. Az dátumintervallumot egy felugró naptárból kellene kiválasztani külön-külön a bejelentkezési időpontot és a távozási időpontot.

Izgatottan várom a tippeket - segitségeket és előre köszönöm!
 
1

Javaslat

Iggy · 2009. Jan. 13. (K), 00.40
Nekem ez jutott eszembe, olvasva a problémádat:

Letárolod a szobaszámt, foglalás kezdetét, foglalás végét (pluszba még amiket akarsz v kell). Ha valaki elküld egy foglalást, akkor megkeresed a vendég által elküldött foglalás végéhez képest legközelebbi, de annál korábbi foglalás kezdetet. Megnézed, hogy a talált foglaláshoz tartozó vég dátum kisebb-e, mint a felhasználó által elküldött foglalás kezdete, ha igen, akkor szabad a szoba, ha nem, akkor foglalt. A legközelebbi időpont megkeresésében szerintem az ORDER BY lesz a segítségedre.
Remélem érthető voltam és működik is, amit kitaláltam, mert ki nem próbáltam a dolgot :)
2

ellenőrzés

jaczkog · 2009. Jan. 13. (K), 10.13
Ha a 12-es szobát szeretnék lefoglalni 2009-01-16-tól 2009-01-18-ig (szállodai gyakorlat szerint ez 2 éjszakát jelent), akkor én lekérdezném az összes vele ütköző foglalást:
select * from foglalas
where foglalt_szoba=12
  and (0<=datediff(foglalas_kezdete, '2009-01-16')
    or 0<datediff(foglalas_vege, '2009-01-16'))
  and (datediff(foglalas_kezdete, '2009-01-18')<0
    or datediff(foglalas_vege, '2009-01-18')<=0)
Ha ez a lekérdezés nem ad vissza sort, akkor a szoba foglalható az adott időre.
3

Köszönöm!

WestPal · 2009. Jan. 13. (K), 12.04
Köszönöm a tippeket és a ráfordított időt!

Én is átböngésztem a netet kicsit még, találtam egy php lehetőséget arra, hogy egy függvénnyel vektorba helyezzem a ket dátum közötti dátumokat, ez arra jó, hogyha például beteszem az adatbázisba a kezdeti dátumot és a távozási dátumot az adott szobának, majd mikor lekerdezem a táblákat tudni fogom mikor van a kezdeti és a távozási időpont, azt ezzel a függvénnyel feldolgozom, visszakapok egy tömböt, majd egy dupla for-al összehasonlitom ezt a tömböt az igényelt lefoglalási dátumok tömbjével és ha van egyezés akkor a szoba már foglalt valamilyen napon - informativ jeleggel ki is lehet iratni, hogy melyik napon, a lefoglalás nem történik meg, ellenkező esetben, ha nincs egyezés, akkor nincs lefoglalt szoba arra a dátumra.

Iggy: amint látom neked is hasonló ötleted volt, csak nem tudom elképzelni az algoritmust, nem értem picit a dolgot, köszi.

Jaczkog: a te ötleted is szerintem egyszerübb és nagyszerübb az enyémnél, csak én nem értem a lekérdezést, neked is köszönöm.

Várom továbbra is tőletek a véleményeket és esetleg ha jobban kifejtenétek az ötleteiteket, persze időtöktől és kedvetektől függően, akkor én azt előre megköszönöm!

Üdv!
4

kifejtés

jaczkog · 2009. Jan. 13. (K), 15.28
Elöljáróban megjegyzem hogy szerintem mindenképpen hatékonyabb és takarékosabb megoldás, ha csak 1 db sql lekérdezéssel tudom ellenőrizni a szoba foglalhatóságát.

Az általam írt lekérdezést így is le lehet írni:
select * from foglalas
where foglalt_szoba=12
  and !(datediff(foglalas_kezdete, '2009-01-16')<0
		and datediff(foglalas_vege, '2009-01-16')<=0)
  and !(0<=datediff(foglalas_kezdete, '2009-01-18')
		and 0<datediff(foglalas_vege, '2009-01-18'))
Ez kb annyit jelent hogy kérem a "foglalas" táblából azokat a foglalásokat, amelyek a 12-es szobára vonatkoznak és nincs az elejük és végük jan.16 előtt és nincs az elejük és végük jan.18 után. Ha van ilyen akkor ütközik a kívánt foglalással.

Remélem így érthetőbb. Ha valami még nem teljesen világos, akkor kérdezz bátran.
5

Köszönöm jackog!

WestPal · 2009. Jan. 13. (K), 16.25
Mostmár teljesen világos. Nekem ez nem is jutott eszembe. Teljesen fölösleges a két dátum közötti dátumokat leellenőrizni, ez a megoldás megszabadít egy rakás fölösleges kódtól!

Hát nagyon hálás vagyok és nagyon örülök hogy ilyen segítőkész emberekre találtam mint ti!
6

Lekerdezesekben meg nem vagyok tul jo!

WestPal · 2009. Jan. 13. (K), 19.46
Esetleg annyiban kérném segitséged - segítségetek, hogy hogyan tudnám hatékonyan ezt a dolgot lekérdezni az én adatbázis struktúrám alapján. Leírom ide az adatbázist:

szoba_kategória[id,nev];
szoba_tipus[id,nev,leiras,kategoria_id]
szobak[id,nev,szoba_tipus_id]
foglalasok[id,szoba_id,kezdeti_datum,tavozasi_datum]

Nagyjából ezek a táblák, persze több fieldekkel, de csak a szükségeseket irtam oda...
Erre kellene a fenti példát egy sql lekérdezésbe tenni, ha lehet.

Előre köszönöm!
7

Már kaptál lekérdezést

zila · 2009. Jan. 15. (Cs), 16.02
A lekérdezés már elhangzott korábban.

Az csak nem okoz gondot, hogy a tábla és mezőneveket átírd a tiédre...
Ha igen, akkor még ne fejlessz szállodai szobafoglaló rendszert :)
8

Kiegészítés

Kenguru · 2009. Jan. 15. (Cs), 17.12
Azért egy dologra még oda kell figyeli foglalási rendszernél.
Nem programozás de fontos. A távozás napján már jöhet új vendég!
Tehát a határnapok kezdeti dátum és a távozás dátum lehet azonos
két foglalás esetén.
A lekérdezést e szerint érdemes megcsinálni.
9

Left joinal megoldottam

WestPal · 2009. Jan. 15. (Cs), 23.45
Sziasztok, igaz hogy kaptam lekérdezést, nem ismertem a datediff-et, meg a mysql sincs még a kisujjamban és én eredetileg webdesignerként dolgozom, de az egyetemen programozást tanulgatok. Igyekszem ellopkodni amit lehet a nagyoktól.

Csak azért gondoltam, hogy megkérdezem, mivel nekem biztos órákba tellene(tellett végül), hogy elkészítsem a lekérdezést, mivel szoba kategóriák vannak, azon belül szoba tipusok és legvégül ezekhez a szoba tipusokhoz vannak rendelve a szobák, amik automatikusan foglalódnak le, aszerint, hogy a listában az első amelyik üres. Könnyebb lenne számomra ha a felhasználó egyenesen a szobát foglalná le, de ő különböző okokból ezt nem teheti, csak szoba tipus alapján választ és a rendszer az első üres szobát adja neki, aminek viszont az ID-át nem lehet ismerni, ha csak nem megyek végig mindegyik szobán az adott szobatipusból és ellenőrzöm le a fenti lekérdezést. Nekem ez mysql-ben még kicsit nehézkes, az este utánnaolvastam és sikerült végül megoldani.

Kenguru:

Azon gondolkodtam most, mikor olvastam hozzászólásod, hogy amikor valaki lefoglal egy szobát, mondjuk 16-tól egész 18-ig, akkor ő a szobába bejelentkezhet mondjuk 16-ikán délben, ott alszik akkor éjjel, másnap 17-ike, akkor éjjel is ott alszik, másnap 18-ika, akkor éjjel még mindig ott alszik, mivel ugye a 18-ikát is lefoglalta, majd a panziói szabályok szerint, gondolom ki van kötve, hogy 19-ike reggel 10-ig el kell hagynia a szobát. Tehát a következő vendég 19ikétől nyugodtan foglalhat szobát, délben fel is mehet - és 10-től 12-ig van idő kitakarítani, ágynemüt cserélni, feltölteni a bárt stb. De mindenképp meg kell kérdeznem az ismerősömet, akinek készítem az oldalt, hogy mégis pontosan, hogy megy ez, én nyaralásokkor soha nem figyeltem különösebben, de azt hiszem így volt például a Gyulai várfürdőn is... Ha tévedek kérlek világosítsatok föl!!!

Köszönöm szépen! Amint kész leszek vele, meg mutatom nektek is mit remekeltem :)
10

éjszakák száma

jaczkog · 2009. Jan. 19. (H), 12.26
Csak magamat tudom idézni:
Ha a 12-es szobát szeretnék lefoglalni 2009-01-16-tól 2009-01-18-ig (szállodai gyakorlat szerint ez 2 éjszakát jelent)...

Persze örülök, hogy Kenguru felhívta rá a figyelmet, mert én elfelejtettem kihangsúlyozni. Természetesen a lekérdezést ennek megfelelően írtam meg.

Ha a szobát nem szám hanem kategória, típus és felszereltség alapján akarod foglalni, akkor persze ennek megfelelően kell módosítani és join-okkal bővíteni a lekérdezést. (Ebben az esetben legközelebb pontosabban kérdezz!)

Sok sikert, kíváncsian várjuk az oldalt!
11

Lassan elkeszülök a programozás reszével

WestPal · 2009. Jan. 19. (H), 19.19
Még pár nap remélhetőleg és a programzással megvagyok, persze keresnem kell egy jó form-validátort, a sessiókkal még gondjaim vannak, nem tudom hogyan lehet azt beállítani, az oldal által becache-elt sessió 30 másodperc után törlődjön abban az esetben ha nincs aktivitás.

Aztán még pár napot eltöltök design-al és végül megmutatom.
12

kérdés a lekérdezéseel kapcsolatban

shadow198811 · 2012. Feb. 15. (Sze), 13.51
Sziastok!

Az érdekelne engem, hogy hogyan tudnám elérni ebben a lekérdezésben, a következőt:
Ne a lefoglalt szobákat listázza ki hanem azokat amik szabadok.
Igy alakitottam át a lekérdezést:

$result=dbquery("select foglalasok.szoba,szobak.szobaszam from foglalasok INNER JOIN szobak on (foglalasok.szoba=szobak.szobaszam) where (datediff(foglalas_tol, '".$erkezik."')>=0  
													or datediff(foglalas_ig, '".$erkezik."')>0)  
													and (datediff(foglalas_tol, '".$tavozik."')<0  
													or datediff(foglalas_ig, '".$tavozik."')<=0) order by szobak.szobaszam asc") or die(mysql_error());
Ez a lekérdezésem kilistázza a foglalt szobákat, de én pont azokat nem akarom kilistázni amik nem foglaltak.
Írtam hozzá egy másik lekérdezést is:
$array=dbarray($result);

							$foglalasok= $array['szobaszam'];
							print $foglalasok;
		
		$result1=dbquery("SELECT * FROM szobak WHERE szobaszam !='".$foglalasok."'"); 
		
de ebben a lekérdezésben csak a $array['szobaszam'] első elemét veszi ki a másikat sajna nem.
Nekem ez a megoldás is jó lenne, ha kivenné az adott tömb összes elemével egyező szobaszámot.

Aki tudna rá megoldást nagoyn megköszönném.

Üdv szabolcs
13

NOT IN

Poetro · 2012. Feb. 15. (Sze), 15.04
Használj NOT IN kifejezést.
$szobaszamok = array(1, 2, 3, 4);

$result = dbquery("SELECT * FROM szobak WHERE szobaszam NOT IN (" . implode(', ', $szobaszamok) . ")");
14

valamiért nem jó

shadow198811 · 2012. Feb. 15. (Sze), 22.16
Kipróbáltam a javaslatodat de valahogy nem tudom működésre bírni az egészet.Ez a két lekérdezés amit használok hozzá, de valamiért a $foglalasok értékét nem adja át a 2. query-nek és mindég csak egy értéknek megfelelő sort vesz ki.
	   $result=dbquery("select szoba from foglalasok where (datediff(foglalas_tol, '".$erkezik."')>=0  
													or datediff(foglalas_ig, '".$erkezik."')>0)  
													and (datediff(foglalas_tol, '".$tavozik."')<0  
													or datediff(foglalas_ig, '".$tavozik."')<=0)") or die(mysql_error());
							while($k=mysql_fetch_assoc($result)){
                                                       
																									
foreach ($k as $ertek){
$foglalasok= $ertek.",";
			print $foglalasok;/*megkapja a két értéket amit kell neki*/
			
			}	
                                               

}
		//$result1=dbquery("select * from szobak where szobaszam !='".$array['szobaszam']."'") or die(mysql_error());
		$result1=dbquery("SELECT * FROM szobak WHERE szobaszam not in ('".$foglalasok."')"); 
		
	
Légyszives valaki nézze meg mit rontok el, mert már második napja küzdök vele hogy jo legyen.Már tényleg mindent kipróbáltam amiről volt valami kis fogalmam a megoldással kapcsolatban, de sehogy sem akar jó lenni.
15

Írasd ki az összerakott SQL

kuka · 2012. Feb. 16. (Cs), 10.15
Írasd ki az összerakott SQL parancsot:

echo "SELECT * FROM szobak WHERE szobaszam not in ('".$foglalasok."')";
Majd próbáld meg egy interaktív segédprogrammal lefuttatni a kiírt parancsot. Tipp: nem fog működni a felső vesszők és vesszők zagyva elszórtsága miatt.

De egyáltalán kellenek másra is a foglalt szoba számok? Mert ha nem, akkor össze is vonhatnád egyetlen lekérdezésbe:

$result1=dbquery("SELECT * FROM szobak WHERE szobaszam not in (
select szoba from foglalasok 
where (datediff(foglalas_tol, '".$erkezik."')>=0 or datediff(foglalas_ig, '".$erkezik."')>0)    
and (datediff(foglalas_tol, '".$tavozik."')<0 or datediff(foglalas_ig, '".$tavozik."')<=0)
)") or die(mysql_error());  
16

Nagyon

shadow198811 · 2012. Feb. 16. (Cs), 16.00
Nagyon szépen köszönöm ez eszembe sem jutott.
De végülis ha majd kellenek a foglalt szobák listája is az majd ugyis másik oldalon lesz ezáltal kell uj lekérdezés is.

mégegyszer köszönöm, és tényleg nem kapott értéket a foglalások változóm az sql-ben.

De most már mükszik:)