sebap123
2.09.2009, 19:28:58
Witam
Piszę skrypt będący czyms w rodzaju strony do rezerwacji pobytu w domku letniskowym. Chce jednak w tym skrypcie zbudowac cos w rodzaju interaktywnego kalendarza, przy pomocy którego będzie można wybrac wolną date (poczatek pobytu), zaznaczyc ją a potem wybrać kiedy ma sie skończyc pobyt. Zaznaczone by były rownież juz zajęte terminy i ich nie można by było wybrać.
Tak naprawdę nie wiem jakim sposobem można to stworzyć. Na początku chcialem to zrobić przy pomocy zwyklej tabeli ale troche chyba za dużo pisania, a pozatym też ten pomysł ma pare luk.
Dlatego mam nadzieje, że może ktoś będzie mial pomysl lub może cos takiego robił, żeby mi pomóc.
scanner
2.09.2009, 19:50:20
Ty chcesz napisać klikalny kalendarzyk, czy procedury w php, które będą tym zarządzać?
sebap123
2.09.2009, 19:52:34
No dobre pytanie zadałeś. Ja myślalem o czyms w rodzaju formularza, ktory będzie przesyłał do bazy danych zaznaczone opcje. Potem je będzie wyświetlał. Ale jak jakaś inna propozycja to bardzo chętnie.
scanner
2.09.2009, 19:58:02
Zacznij od bazy danych.
Zaprojektuj dwie tablice:
- Lokal
- Rezerwacja
będące w relacji 1 (Lokal) do wielu (Rezerwacja)
W rezerwacji oczywiście musisz pamiętać o dwu polach timestamp - "Od", "Do"
Gdy będziesz miał te tablice, pokaż co zrobiłeś i polecimy dalej.
sebap123
2.09.2009, 19:59:13
Ok. To się zabieram do roboty.
phpion
2.09.2009, 20:02:22
Cytat(scanner @ 2.09.2009, 20:58:02 )

Zacznij od bazy danych.
Zaprojektuj dwie tablice:
- Lokal
- Rezerwacja
będące w relacji 1 (Lokal) do wielu (Rezerwacja)
W rezerwacji oczywiście musisz pamiętać o dwu polach timestamp - "Od", "Do"
Gdy będziesz miał te tablice, pokaż co zrobiłeś i polecimy dalej.
Pozwolę sobie wskoczyć z offtopem: kurde, świetne podejście! Bardzo mi się podoba taka forma pomocy, w której mówi się człowiekowi co powinien po kolei zrobić aby osiągnąć swój cel. Może warto brać przykład ze ~scannera i również udzielać pomocy w tej formie?
sebap123
14.09.2009, 14:37:57
Dobra trochę czasu to zajęło ale udalo mi się stworzyc dwie bazy danych które są w zajemnej relacji:
Baza Domy:
składa się z pola id i nazwa
Baza Rezerwacje:
składa się z:
id
login
data od
data do
ilosc miejsc
data rezerwacji
uwagi
id_domu.
Może teraz ktoś mi pomoże z reszta bo też szukałem troche w tym czasie, żeby to samemu stworzyć ale niestety nic nie znalazłem.
f1xer
14.09.2009, 14:51:15
Ok, to teraz możesz zaprojektować sobie formularz, z polami data przyjazdu i data wyjazdu (czyli rezerwacja od, do ). Możesz do kalendarza użyć tego pluginu do jquery:
http://jqueryui.com/demos/datepicker/
Ociu
14.09.2009, 15:16:32
Cytat(phpion @ 2.09.2009, 21:02:22 )

Pozwolę sobie wskoczyć z offtopem: kurde, świetne podejście! Bardzo mi się podoba taka forma pomocy, w której mówi się człowiekowi co powinien po kolei zrobić aby osiągnąć swój cel. Może warto brać przykład ze ~scannera i również udzielać pomocy w tej formie?
Tu też brawa dla @sebap123 że nie chce pomocy typu "chce gotowca" tylko sam coś chce stworzyć własnymi siłami. To wyższy poziom niż Przedszkole, że trzeba gotowy kod dawać

EOT.
sebap123
14.09.2009, 15:32:57
No dobra. Dzieki za tego plugina. Tylko wiesz, gdybym wiedział jak to połączyć z php to bym tutaj nie pisał.
A tak to...
To może cos mi byś raczyl podpowiedzieć?
f1xer
14.09.2009, 16:09:03
mówisz i masz

Zobacz plugin uzupełni ci pole tekstowe po kliknięciu submit to pole zostanie wysłane do skryptu php a tam musisz odebrać dane. Jeżeli używasz metody POST to kod będzie wyglądał mniej więcej tak:
// dalsze działania to np. sprawdzanie formatu i realności daty itd. a jak już wszystkie dane są ok to możesz dodać do bazy danych nowy rekork
a teraz jak użyć tego plugina:
przeczytaj dokumentację, jest tam wszystko napisane jest również przykładowy kod źródłowy.
Tak na szybko
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link type="text/css" href="sciezka/do/ui/css/smoothness/jquery-ui-1.7.2.custom.css" rel="stylesheet" /> <script type="text/javascript" src="sciezka/do/jquery/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="sciezka/do/ui/jquery-ui-1.7.2.custom.min.js"></script> <script type="text/javascript"> $(function() {
$("#dataod").datepicker();
$("#datado").datepicker();
});
<form action="rezerwuj.php"> <input type="text" id="dataod" /> <input type="text" id="datado" /> <input type="submit" value="rezerwuj" />
sebap123
14.09.2009, 16:15:40
Dzięki wielkie, narazie.
Biore się do pracy.
scanner
14.09.2009, 17:19:38
Do kalendarza to droga daleka.
IMO teraz powinieneś wrzucić do bazy jakieś lokale, i zacząć tworzyć rezerwacje, jak już będziesz umiał rezerwować lokale, musisz zacząć wprowadzać zabezpieczenia - czyli przygotować zapytania, które zweryfikują, czy dany lokal w podanym zakresie czasu nie jest przypadkiem zajęty. Do tego nie potrzebujesz kalendarzy, wystarczy php/sql i nieco testów.
Jeśli teraz zaczniesz się użerać z htmlem/js i nie daj boże z kolorkami, to polegniesz - gwarantuję.
sebap123
14.09.2009, 20:31:14
No czyli narazie napisać sam skrypt (tak już uogólniam) a potem UI. Dobrze myśle?
I takie jeszcze uwagi:
1.@f1xer
Dzięki za skrypt ale w tym projekcie bardziej mi chodzi o cos takiego, że sam uzytkownik wybiera daty na stałym kalendarzu. zaznacza dae startu i konca. Jest podzial na daty wolne i zajęte. Wiesz np. dwoma kolorami.
2.
W tym skrypcie mam nieco ulatwiona wersję bo jest tylko jeden dom. W wersji finalnej chce dac co najmniej 5. Ale myślę, że mechanizmy stworzone dla jedego (z ip 1) będą takie same jak dla domu o ip np. 4.
LifeGuard
7.12.2009, 07:49:57
Cytat(scanner @ 14.09.2009, 17:19:38 )

Do kalendarza to droga daleka.
IMO teraz powinieneś wrzucić do bazy jakieś lokale, i zacząć tworzyć rezerwacje, jak już będziesz umiał rezerwować lokale, musisz zacząć wprowadzać zabezpieczenia - czyli przygotować zapytania, które zweryfikują, czy dany lokal w podanym zakresie czasu nie jest przypadkiem zajęty. Do tego nie potrzebujesz kalendarzy, wystarczy php/sql i nieco testów.
Jeśli teraz zaczniesz się użerać z htmlem/js i nie daj boże z kolorkami, to polegniesz - gwarantuję.
Witam mam podobny problem
Tylko że u mnie chodzi o prostą rezerwację samochodów z panelu adm.
Zrobiłem dwie tabele w bazie danych:
auta:
id_auta, model, opis
wypozyczenia:
id_wypozyczenia, id_auta, od, do
if data od > teraz - rezerwacja
if data od ≤ teraz ≤ - zajęte
if data do < teraz - wolne
dobrze kombinuję? jak dalej to ugryźć?
scanner
8.12.2009, 00:08:16
Jeśli chcesz sprawdzić, czy "Dzisiaj" jest "w" jakiejś rezerwacji, to jest magiczne "BETWEEN" w SQLu:
NOW() BETWEEN od AND do
LifeGuard
8.12.2009, 15:53:32
Cytat(scanner @ 8.12.2009, 00:08:16 )

Jeśli chcesz sprawdzić, czy "Dzisiaj" jest "w" jakiejś rezerwacji, to jest magiczne "BETWEEN" w SQLu:
NOW() BETWEEN od AND do
a w jakim formacie przechowywać daty? TIMESTAMP? zależy mi na tym żeby prócz dnia była też brana pod uwagę godzina
phpion
8.12.2009, 15:55:14
DATETIME
LifeGuard
13.12.2009, 13:28:55
mam taki kod:
function form_dodaj_wypozyczenie()
{
echo "<p align=center><u>Samochody obecnie wypożyczone:</u><br>"; $cccs = mysql_query("SELECT w.id_auta, DATE_FORMAT(w.do, '%Y-%m-%d %H:%i') AS do, a.id_auta, a.model FROM w_wypozyczenia as w INNER JOIN w_auta as a ON a.id_auta = w.id_auta WHERE NOW() BETWEEN w.od AND w.do "); $s_id_auta = $cccsrow["id_auta"];
$s_do = $cccsrow["do"];
$s_model = $cccsrow["model"];
echo "<p id=aktualnie align=center>"; echo "<b>".$s_model."</b>"; echo " aktualnie wypożyczony do "; echo "<b> ".$s_do." </b><br>"; }
echo "<br><p align=center><u>Samochody obecnie zarezerwowane:</u><br>"; $cccs = mysql_query("SELECT w.id_auta, DATE_FORMAT(w.od, '%Y-%m-%d %H:%i') AS od, DATE_FORMAT(w.do, '%Y-%m-%d %H:%i') AS do, a.id_auta, a.model FROM w_wypozyczenia as w INNER JOIN w_auta as a ON a.id_auta = w.id_auta WHERE NOW() < w.od"); $s_id_auta = $cccsrow["id_auta"];
$s_do = $cccsrow["do"];
$s_od = $cccsrow["od"];
$s_model = $cccsrow["model"];
echo "<p id=rezerwacja align=center>"; echo "<b>".$s_model."</b>"; echo " zarezerwowany od "; echo "<b> ".$s_od." </b>"; echo "<b> ".$s_do." </b><br>"; }
echo "<br /><form action=\"xxx.php?a=dodaj_wypozyczenie\" method=\"post\">"; echo "<br><p align=\"center\"><b><u>Dodaj rezerwację:</u><b></p><br>"; echo "<table table border=\"0\" width=\"500\" border=\"1\" align=\"center\" cellspacing=\"0\" cellpadding=\"0\">";
$query = mysql_query("SELECT * FROM `w_auta` ORDER BY `id_auta` DESC"); echo "<tr><td width=\"200\" align=\"right\">Nazwa samochodu: </td><td width=\"300\"><select name=\"s_id_auta\">"; echo "<option value=''> --- Wybierz auto --- </option>";
{
echo " <option value=\"{$data['id_auta']}\">{$data['model']}</option>\n"; }
echo "</select></td></tr>"; echo "<tr><td width=\"200\" align=\"right\">rezerwacja od: </td><td width=\"300\"><input id=\"date\" type=\"text\" name=\"s_od\" size=\"20\"></td></tr>"; echo "<tr><td width=\"200\" align=\"right\">rezerwacja do: </td><td width=\"300\"><input id=\"date2\" type=\"text\" name=\"s_do\" size=\"20\"></td></tr>"; echo "<tr><td width=\"200\" align=\"right\">klient: </td><td width=\"300\"><input type=\"text\" name=\"s_klient\" size=\"20\"></td></tr>"; echo "<tr><td width=\"200\" align=\"right\">tel. do klienta: </td><td width=\"300\"><input type=\"text\" name=\"s_telefon\" size=\"20\"></td></tr>"; echo "<tr><td width=\"200\" align=\"right\">uwagi: </td><td width=\"300\"><textarea rows=\"7\" name=\"s_uwagi\" cols=\"30\"></textarea></td></tr>"; echo "<tr><td width=\"100%\" colspan=\"2\"><br><input type=\"submit\" value=\"Zapisz\" name=\"submit\" style=\"float: right\"></td></tr>";
}
function dodaj_wypozyczenie()
{
$s_id_auta = $_POST['s_id_auta'];
$s_od = $_POST['s_od'];
$s_do = $_POST['s_do'];
$s_klient = $_POST['s_klient'];
$s_telefon = $_POST['s_telefon'];
$s_uwagi = $_POST['s_uwagi'];
echo "<p align=\"center\"><b>Wybierz samochod!</b><br><br><a href=\"java script:history.go(-1);\"><u>....powrót...</u></a></p>"; }
else {
$query = "INSERT INTO `w_wypozyczenia` ( `id_wyp`, `id_auta`, `od`, `do`, `klient`, `telefon`, `uwagi` ) VALUES ('', '$s_id_auta', '$s_od', '$s_do', '$s_klient', '$s_telefon', '$s_uwagi')";
echo "<p align=\"center\"><b>Rezerwacja dodana do bazy</b> (".$s_id.")</p>"; }
}
wszystko pięknie działa, tylko chciałem stworzyć walidację zajętości danego auta w danym terminie...
tzn jeśli "id_auta" w okresie "od" do "do" jest zajęte ostrzeż i nie idź dalej...
jak to najlepiej zrobić?
piotr94
13.12.2009, 14:03:18
a nie lepiej poprostu do bazy zapisywać do bazy datę z funkcji mktime(); ->
http://pl.php.net/manual/pl/function.mktime.phpi sprawdzać poprzez ... WHERE $data_poczatku>data_poczatku AND $data_konca ...
LifeGuard
13.12.2009, 14:29:58
ok. ale formę zapisu i sprawdzania już mam, bardziej chodzi mi o sposób porównania, aby nie zdublować wpisów wypożyczeń
spamcop
22.12.2009, 09:41:39
Musisz również uwzględnić w mechanizmie bazodanowym
tzw. transakcje, aby zapobiec przypadkowej rownoczesnej rezerwacji
tego samego lub zachodzacego terminu przez kilka osob.
Tego nie mozna wykluczyc. Tabele musza byc LOCKowane i przed samym zapisem
sprawdzane czy ktos nie wbił sie na rezerwowany termin wczesniej.
Sprawdz jak to jest zrobione tutaj (kilka ciekawych rozwiazan):
https://www.e-rezerwacje24.plKliknij w Menu / przykladowa realizacja
a pozniej na stronie pensjonatu Menu / E-rezerwacje
Nie wiem czy warto sie meczyc nad wlasnym mechanizmem, jesli
tutaj daja bardzo
rozbudowany system obslugujacy do tego
platnosci on-line + 3 wersje jezykowe, za 1PLN rocznie
(w jakiejs tam promocji)
Podlaczenie systemu do swojego obiektu to umieszczenie jednego linku.
Napisanie dedykowanego systemu dla pojedynczego malego pensjonatu
bedzie z pewnoscia obarczone wieloma bledami i jest po prostu
bardzo czasochlonne, a zatem czesto nieoplacalne dla wlasciciela.
--
pozdr
s.
LifeGuard
22.12.2009, 10:31:24
dzięki za podpowiedź ale nieprzespana nocka i skrypt powstał...
zanim zapisuje rekordy do bazy wcześniej sprawdzam czy w tablicy składającej się z odpowiednio wybranych rekordów z bazy nie ma już takich wpisów...
cała sprawa rozgrywała się o sprawne napisanie zapytania MySQL gdzie było multum AND i OR (czyli nawiasy i inne)
spamcop
4.01.2010, 11:04:35
Niezle. Czy w trakcie dodawania nowego wpisu lockujesz tabele, czy tylko sprawdzasz czy nie ma wpisu?
Jak bedziesz szukał betatesterow swojego systemu, chetnie potestuje

daj znac (podaj linka).
--
pozdr.
s.
emtiej
4.01.2010, 16:40:22
Cytat(LifeGuard @ 13.12.2009, 13:28:55 )

mam taki kod:
wszystko pięknie działa, tylko chciałem stworzyć walidację zajętości danego auta w danym terminie...
tzn jeśli "id_auta" w okresie "od" do "do" jest zajęte ostrzeż i nie idź dalej...
jak to najlepiej zrobić?
Kolego załóż swój temat, a nie mieszam, niedługo każdy wewali się do tego tematu i będzie jeden wielki off top i nie będzie wiadomo która odpowiedź jest do czego... W jednym temacie zajmujemy się jednym skryptem i może wydaje ci się on podobny to wcale taki nie jest.
emtiej ma racje, nie robimy offtopa. Jednak ne bawimy się też w moderatorów, od tgo jest opcja raportuj.
Pozdrawiam.
celbarowicz
4.01.2010, 23:16:33
zajrzyj na noce.pl ---- pracowałem nad czymś podobnym--może dogadamy się na PW
ppietras86
28.01.2010, 20:20:03
witam
Pisze podobną aplikacje. Ma rezerwować pokoje w pensjonacie. Baze mam gotowa i zapytanie sprawdzające dostępnosc pokoi w zadanym terminie również. Zapytanie w phpmyadmin działa bez zarzutu. przepisalem je na php i teraz chce wyświetlić wyniki na stronie i tutaj zonk. Nie wiem czy dobrze to zrobiłem - ja już nie mam pomysłu
Dostaje bład: Fatal error: Call to a member function fetch_assoc() on a non-object in C:\wamp\www\hotel\sprawdz.php on line 105
ponizej daje kod który to robi - nie wiem gdzie jest błąd - może komuś sie uda coś wyniuchać. Dajcie znać
<?php
$przyjazd = $_POST['przyjazd'];
$odjazd = $_POST['odjazd'];
$stmt = "SELECT numer_pokoju, cena,
IF (
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$przyjazd',
mid( group_concat( data_do ORDER BY data_od DESC separator ' ' ) , 1, 10 ) ,
mid( group_concat( data_do ORDER BY data_do DESC separator ' ' ) , 12, 10 )) AS wolna_data_od,
IF (
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$odjazd', '~',
mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 )) AS wolna_data_do
FROM pokoje LEFT JOIN rezerwacje USING ( id_pokoju )
WHERE data_od < '$przyjazd' or data_do >= '$odjazd' OR data_do is null
GROUP BY numer_pokoju
)";
$result = $db_handle->query($stmt);
echo '<table border="1"><tr><td>Pokój nr</td><td>Cena</td><td>Przyjazd</td><td>Odjazd</td><td>Rezerwuj</td></tr>'; while ($row = $result->fetch_assoc()) {
$numer_pokoju = $row['numer_pokoju'];
$cena = $row['cena'];
echo '<tr><td>'. $numer_pokoju .'</td><td>'. $cena .'</td><td>'. $przyjazd .'</td><td>'. $odjazd .'</td><td><a href="rezerwacja.php?pokoj='. $row['id_pokoju'] .'?przyjazd='. $przyjazd .'?odjazd='. $odjazd. '"><img src="images/rezerwacja.jpg"></a></td></tr>'; }
?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.