Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: System rezerwacyjny w PHP
Forum PHP.pl > Forum > PHP
sebap123
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
Ty chcesz napisać klikalny kalendarzyk, czy procedury w php, które będą tym zarządzać?
sebap123
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
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
Ok. To się zabieram do roboty.
phpion
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
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
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
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ć smile.gif

EOT.
sebap123
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
mówisz i masz smile.gif 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:
  1. $dataod=mysql_real_escape_string($_POST['dataod']); // i w tym momencie masz datę przyjazdu
  2. $datado=mysql_real_escape_string($_POST['datado']); // i w tym momencie masz datę odjazdu
  3. // 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
  1. <!DOCTYPE html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Rezerwacje</title>
  5. <link type="text/css" href="sciezka/do/ui/css/smoothness/jquery-ui-1.7.2.custom.css" rel="stylesheet" />
  6. <script type="text/javascript" src="sciezka/do/jquery/jquery-1.3.2.min.js"></script>
  7. <script type="text/javascript" src="sciezka/do/ui/jquery-ui-1.7.2.custom.min.js"></script>
  8. <script type="text/javascript">
  9. $(function() {
  10. $("#dataod").datepicker();
  11. $("#datado").datepicker();
  12. });
  13. </head>
  14. <form action="rezerwuj.php">
  15. <label for="dataod">Przyjazd:</label>
  16. <input type="text" id="dataod" />
  17. <label for="datado">Wyjazd:</label>
  18. <input type="text" id="datado" />
  19. <input type="submit" value="rezerwuj" />
  20. </form>
  21. </body>
  22. </html>

sebap123
Dzięki wielkie, narazie.
Biore się do pracy.
scanner
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
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
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
Jeśli chcesz sprawdzić, czy "Dzisiaj" jest "w" jakiejś rezerwacji, to jest magiczne "BETWEEN" w SQLu:
  1. NOW() BETWEEN od AND do
LifeGuard
Cytat(scanner @ 8.12.2009, 00:08:16 ) *
Jeśli chcesz sprawdzić, czy "Dzisiaj" jest "w" jakiejś rezerwacji, to jest magiczne "BETWEEN" w SQLu:
  1. 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
DATETIME
LifeGuard

mam taki kod:
  1. function form_dodaj_wypozyczenie()
  2. {
  3.  
  4. echo "<p align=center><u>Samochody obecnie wypożyczone:</u><br>";
  5. $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 ");
  6. while ($cccsrow = mysql_fetch_array($cccs, MYSQL_ASSOC)) {
  7. $s_id_auta = $cccsrow["id_auta"];
  8. $s_do = $cccsrow["do"];
  9. $s_model = $cccsrow["model"];
  10. echo "<p id=aktualnie align=center>";
  11. echo "<b>".$s_model."</b>";
  12. echo " aktualnie wypożyczony do ";
  13. echo "<b> ".$s_do." </b><br>";
  14. }
  15. echo "<br><p align=center><u>Samochody obecnie zarezerwowane:</u><br>";
  16. $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");
  17. while ($cccsrow = mysql_fetch_array($cccs, MYSQL_ASSOC)) {
  18. $s_id_auta = $cccsrow["id_auta"];
  19. $s_do = $cccsrow["do"];
  20. $s_od = $cccsrow["od"];
  21. $s_model = $cccsrow["model"];
  22. echo "<p id=rezerwacja align=center>";
  23. echo "<b>".$s_model."</b>";
  24. echo " zarezerwowany od ";
  25. echo "<b> ".$s_od." </b>";
  26. echo " do ";
  27. echo "<b> ".$s_do." </b><br>";
  28. }
  29.  
  30. echo "<br /><form action=\"xxx.php?a=dodaj_wypozyczenie\" method=\"post\">";
  31. echo "<br><p align=\"center\"><b><u>Dodaj rezerwację:</u><b></p><br>";
  32. echo "<table table border=\"0\" width=\"500\" border=\"1\" align=\"center\" cellspacing=\"0\" cellpadding=\"0\">";
  33.  
  34. $query = mysql_query("SELECT * FROM `w_auta` ORDER BY `id_auta` DESC");
  35. echo "<tr><td width=\"200\" align=\"right\">Nazwa samochodu: </td><td width=\"300\"><select name=\"s_id_auta\">";
  36. echo "<option value=''> --- Wybierz auto --- </option>";
  37.  
  38. while ($data = mysql_fetch_array($query, MYSQL_ASSOC))
  39. {
  40. echo " <option value=\"{$data['id_auta']}\">{$data['model']}</option>\n";
  41. }
  42.  
  43. echo "</select></td></tr>";
  44. 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>";
  45. 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>";
  46. echo "<tr><td width=\"200\" align=\"right\">klient: </td><td width=\"300\"><input type=\"text\" name=\"s_klient\" size=\"20\"></td></tr>";
  47. echo "<tr><td width=\"200\" align=\"right\">tel. do klienta: </td><td width=\"300\"><input type=\"text\" name=\"s_telefon\" size=\"20\"></td></tr>";
  48. echo "<tr><td width=\"200\" align=\"right\">uwagi: </td><td width=\"300\"><textarea rows=\"7\" name=\"s_uwagi\" cols=\"30\"></textarea></td></tr>";
  49. echo "<tr><td width=\"100%\" colspan=\"2\"><br><input type=\"submit\" value=\"Zapisz\" name=\"submit\" style=\"float: right\"></td></tr>";
  50. echo "</form>";
  51. echo "<br />";
  52.  
  53.  
  54. }
  55.  
  56. function dodaj_wypozyczenie()
  57. {
  58.  
  59. $s_id_auta = $_POST['s_id_auta'];
  60. $s_od = $_POST['s_od'];
  61. $s_do = $_POST['s_do'];
  62. $s_klient = $_POST['s_klient'];
  63. $s_telefon = $_POST['s_telefon'];
  64. $s_uwagi = $_POST['s_uwagi'];
  65.  
  66. echo "<p align=\"center\"><b>Wybierz samochod!</b><br><br><a href=\"java script:history.go(-1);\"><u>....powrót...</u></a></p>";
  67. }
  68. else {
  69.  
  70. $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')";
  71. mysql_query($query);
  72. $s_id = mysql_insert_id();
  73. echo "<p align=\"center\"><b>Rezerwacja dodana do bazy</b> (".$s_id.")</p>";
  74. }
  75. }



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
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 ... questionmark.gif
LifeGuard
ok. ale formę zapisu i sprawdzania już mam, bardziej chodzi mi o sposób porównania, aby nie zdublować wpisów wypożyczeń
spamcop
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.pl

Kliknij 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 snitch.gif (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
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
Niezle. Czy w trakcie dodawania nowego wpisu lockujesz tabele, czy tylko sprawdzasz czy nie ma wpisu?

Jak bedziesz szukał betatesterow swojego systemu, chetnie potestuje winksmiley.jpg daj znac (podaj linka).

--
pozdr.
s.
emtiej
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.
Ociu
emtiej ma racje, nie robimy offtopa. Jednak ne bawimy się też w moderatorów, od tgo jest opcja raportuj.

Pozdrawiam.
celbarowicz
zajrzyj na noce.pl ---- pracowałem nad czymś podobnym--może dogadamy się na PW
ppietras86
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ć
  1. <?php
  2.  
  3.  
  4. $przyjazd = $_POST['przyjazd'];
  5. $odjazd = $_POST['odjazd'];
  6.  
  7. $stmt = "SELECT numer_pokoju, cena,
  8. IF (
  9. mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$przyjazd',
  10. mid( group_concat( data_do ORDER BY data_od DESC separator ' ' ) , 1, 10 ) ,
  11. mid( group_concat( data_do ORDER BY data_do DESC separator ' ' ) , 12, 10 )) AS wolna_data_od,
  12. IF (
  13. mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 ) < '$odjazd', '~',
  14. mid( group_concat( data_od ORDER BY data_od DESC separator ' ' ) , 1, 10 )) AS wolna_data_do
  15. FROM pokoje LEFT JOIN rezerwacje USING ( id_pokoju )
  16. WHERE data_od < '$przyjazd' or data_do >= '$odjazd' OR data_do is null
  17. GROUP BY numer_pokoju
  18. )";
  19. $result = $db_handle->query($stmt);
  20.  
  21. echo '<table border="1"><tr><td>Pokój nr</td><td>Cena</td><td>Przyjazd</td><td>Odjazd</td><td>Rezerwuj</td></tr>';
  22. while ($row = $result->fetch_assoc()) {
  23. $numer_pokoju = $row['numer_pokoju'];
  24. $cena = $row['cena'];
  25. 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>';
  26. }
  27. echo '</table>';
  28.  
  29.  
  30. ?>

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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.