Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rezerwacje online
Forum PHP.pl > Forum > Bazy danych > MySQL
EliaS
Witam
No i mam kolejny problem:(
otoż robie wlasnie system rezerwacji biletow autokarowych. Wszystko jest na bazach mysql struktura bazy wyglada nastepujaco:

id | stacja1 | miejsca1 | stacja2 | miejsca2 | stacja3 | miejsca3 | stacja4 | miejsca4 | stacja5 |miejsca5

No i tutaj pojawia sie problem typu rezerwacji miejsc.Otoz jak wiadomo ktos moze zarezerwowac miejsce np. na trasie stacja1 - stacja4. Na kazda stacje przypada okreslona ilosc miejsc,wiec niezabardzo wiem jak zrobic taki system ktory automatycznie odejmowal by dana ilosc miejsc ale na odcinku wybranym przez rezerwujacego, tak by jezeli zarezerwuje podroz ze stacji 2 do stacji 4 to by miejsca odjelo na calym odcinku czyli rowniez na stacji3. Myslalem cos o wewnetrznych wskaznikach w bazach ale nie zabardzo wiem jak to sie je:(

Nie wiem czy wyrazilem sie jasno ale licze na pomoc.
Zbłąkany
Moglbys przy wyslaniu rezerwacji pobrac pola z miejscami na danej trasie i odjac od kazdej wartosci ilosc zarezerwowanych miejsc i zapisac ponownie do bazy wg mnie to by bylo najlepsze rozwiazanie smile.gif
EliaS
no wlasnie o to chodzi ze aby pobrac z trasy stacja2-stacja4 ilosc miejsc to musze zrobic cos takiego zeby automatycznie pobieral badz od razu zmienial ilosci miejsc ale na calym odcinku w zaleznosci jakie stacjie wybierze. Mozna to zrobic na instrukcjach ale to mozna by sie zajechac przy wiekszej ilosci stacji. Potrzebuje zrobic cos takiego by skrypt sam rozpoznawal ze miedzy stacja2 a stacja4 jest jeszcze stacja3 badz inne.
cboot
1. Czy zamierzasz to z czymś łączyć? A konkretnie, czy będziesz to łączył z php? Bo jeśli tak, to sprawa przedstawia się łatwiej. Lepiej zrealizować te funkcje w php.
2. Co to dokładnie jest za tabela, co przechowywane jest w poszczególnych polach? Bo jeśli wiersze to mają być kolejne rezerwacje, kolumna stacja1 ma przechowywać nazwę stacji, a kolumna miejsca1 ma przechowywać liczbę zarezerwowanych przez danego klienta miejsc na danej stacji, to tablica jest źle zrobiona (w takim wypadku we wszystkich polach kolumny stacja1 będzie przecież ta sama nazwa) i trzeba ją znormalizować, a tak prościej mówiąc, to umieścić te nazwy stacji w oddzielnej tabeli.

Ale napisz konkretnie co chcesz przechowywać i do jakich rzeczy ma służyć ta tabela, czyli co ma dać się w niej obliczyć. Wtedy będziemy mogli podyskutować dalej.
EliaS
a więc juz tlumacze
1. Tak, oczywiscie wszystko robie w php.
2. Tabela ta przedstawia dany kurs autobusu oraz miejsca jakie sa dostepne na poszczegolnych stacjach. z tej tabeli sa wyciagane informacje na strone o danym kursie i kiedy klient rezerwuje miejsce to na danym odcinku musza te miejsca zniknac(liczba wolnych miejsc sie zmniejsza). Tak wiec pola stacja sa poprostu nazwami poszczegolnych przystankow danego kursu natomiast w polach miejsca przechowywana jest ilosc miejsc jaka jest wolna na danym przystanku. Tak wiec bol polega na tym aby jesli ktos zaznaczy w formularzu ze chce jechac ze stacji1 do stacji3 to aby caly ten odcinek czyli rowniez na stacji2 odjelo w polach miejsca1,2,3 wolne miejsce.
cboot
A więc w takim wypadku Twoja tabela miałaby tylko jeden długi wiersz, co jest chyba niezbyt szczęśliwym rozwiązaniem :wink:
Moim zdaniem najlepiej jest zrobić to tak:

id | nazwa_stacji | wolne_miejsca | numer_stacji

[sql:1:309d2c7a0b]CREATE TABLE stacje (
id TINYINT(5) AUTO_INCREMENT DEFAULT '0' NOT NULL,
nazwa VARCHAR(20) NOT NULL,
wolne_miejsca SMALLINT(5) NOT NULL,
numer_stacji TINYINT(5) NOT NULL,
PRIMARY KEY ( `id` )
)[/sql:1:309d2c7a0b]

Przy czym id byłoby oczywiście kluczem z auto_increment. Pole numer stacji jest niby niepotrzebne, bo na pierwszy rzut oka to to samo, co id, ale jest potrzebne, jeśli kiedyś zajdzie potrzeba np. wstawienia dodatkowej stacji gdzieś w środek, itd. Możemy więc, używać pola numer_stacji do ustalania kolejności poszczególnych stacji. Pola id nie zmieniamy sami i pozostawiamy je jako klucz po prostu.

W takim wypadku odjęcie wolnych miejsc przy rezerwacji, wyglądałoby następująco:
[sql:1:309d2c7a0b]UPDATE stacje SET wolne_miejsca = wolne_miejsca - $ilosc_rezerwowanych_miejsc WHERE numer_stacji BETWEEN $stacja_poczatkowa AND $stacja_koncowa[/sql:1:309d2c7a0b]
Gdzie zmienne $ilosc_rezerwowanych_miejsc, $stacja_poczatkowa i $stacja_koncowa pochodziłby ze skryptu php oczywiście (te dwie ostatnie to numery stacji, a nie ich nazwy oczywiście smile.gif ).
EliaS
Czyli z tego co zrozumialem proponujesz zrobienie na dany kurs osobna tabele? bo jesli nie trzymac danych o przystankach w wierszach to czyli w kolumnach? Moze i jest to tez koncepcja... trzeba sprawdzic smile.gif
cboot
Na każdy kurs osobną tabelę to nie. To byłoby raczej skopane. Wystarczy dodać dodatkowe pole:

id | nazwa_stacji | wolne_miejsca | numer_stacji | numer_kursu

I wtedy zapytanie będzie wyglądać tak:

[sql:1:531b68f713]UPDATE stacje SET wolne_miejsca = wolne_miejsca - $ilosc_rezerwowanych_miejsc WHERE numer_kursu = $numer_kursu AND numer_stacji BETWEEN $stacja_poczatkowa AND $stacja_koncowa[/sql:1:531b68f713]
EliaS
No faktycznie podaleś lepsze rozwiązanie tylko jeszcze jedna kwestia mi sie nasuwa. Otóż dany kurs jezdzi co 22 godziny wyłączając godziny od 0.00 do 5.00 i teraz czy na kazda godzine musze miec osobny numer kursu? Chodzi o to zeby na danym kursie rezerwowalo wybrane miejsce, bo ktos moze rezerwowac na dzisiaj a inny kurs za tydzień. Wiec dana trasa nie bedzie sie zmieniac i mozna faktycznie trzymac dane odnosnie trasy w jednej tabeli, ale jak rezerwowac na tej samej trasie tylko kurs o innym czasie?
cboot
No to tak na przykład:
Cytat
id | nazwa_stacji

Nazwy stacji wywalamy do odzielnej tabeli.
Cytat
id | id_stacji | numer_porzadkowy_stacji | numer_trasy

Tutaj przechowujemy trasy kursów, które są stałe. numer_porzadkowy_stacji odpowiada za kolejność stacji na danej trasie (mówi, która to jest stacja na danej trasie).
Cytat
id | id_stacji | id_trasy | czas_kursu | wolne_miejsca

Tutaj już przechowujemy rezerwacje na konkretnych kursach (ruszających o danej godzinie, czy danego dnia) na danej trasie.

Teraz jeśli chcemy wprowadzić rezerwację na danym kursie (o konkretnej godzinie początkowej) od stacji A do stacji B, to musimy najpierw wczytać z tabeli trasy id wszystkich stacji, które będzie trzeba updatować:
[sql:1:3b5dcb4ae3]select id_stacji from trasy where numer_trasy = $trasa AND numer_porzadkowy_stacji BETWEEN $stacja_poczatkowa AND $stacja_koncowa[/sql:1:3b5dcb4ae3]
I następnie w jakiejś pętli dla każdego id_stacji z wyniku tego zapytania zrobić update w tabeli rezerwacje:
[sql:1:3b5dcb4ae3]update rezerwacje set wolne_miejsca = wolne_miejsca - $liczba_rezerwowanych_miejsc where id_stacji = $id_stacji and numer_trasy = $trasa and czas_kursu = $czas[/sql:1:3b5dcb4ae3]
DeyV
dzięki takiemu zapisowi w bazie bardzo łątwo również sprawdzić, czy na danym odcinku jest jeszcze wystarczająca ilośc wolnych miejsc.
[sql:1:5988957ee0]SELECT MIN( wolne_miejsca )
FROM trasy
WHERE numer_trasy = $trasa AND numer_porzadkowy_stacji BETWEEN $stacja_poczatkowa AND $stacja_koncowa[/sql:1:5988957ee0]

Jeśli więc okaże się, że wynik będzie mniejszy niż ilość miejsc które własnie chcemy sprzedać, to znaczy, że przynajmniej na jednym z wycinków danej trasy pasażerowie musieli by sobie siedzieć na kolanach winksmiley.jpg
EliaS
No i właśnie o to chodzi ze kazdy odcinek musi miec swoja liczbe miejsc, a nie tylko zdejmowalo rezerwacje na calym odcinku.
EliaS
Robie tak jak podpowiedziales mi cboot ale znow mam problem z ustaleniem $numer_poczatkowy i koncowy.Żeby ustalic te dwie zmienne musze je wyciagnac z petli wykonujacej zapytanie sql. Kod wyglada tak:
[php:1:c1e0ef24f8]<?php
$city = "SELECT * FROM miejscowosci WHERE miejscowosc='$odjazd' || miejscowosc='$przyjazd'";
$do = mysql_query($city, $conn);
while ($result = @mysql_fetch_array($do))
{
$check = "SELECT * FROM trasy WHERE id_miejscowosci=$result[id] AND id_trasy='$trasa' ";
$do1 = mysql_query($check, $conn);
while ($result1 = @mysql_fetch_array($do1))
#z tego zapytania moge wyciagnac $result1[nr_porzadkowy]

?>[/php:1:c1e0ef24f8]

Ale jak te dwa wyniki tego zapytania przypisac do zmiennej $stacja poczatkowa oraz $stacja_koncowa? Bo te zmienne beda mi pottrzebne skolei do okreslenia calego odcinka BEtWEEN tymi stacjami smile.gif Pewnie to jest prosty problem ale cos mam przycmienie a swoja droga w php daawnoo juz nie robilem sad.gif
cboot
A jak w tej Twojej tabeli są zaznaczane te stacje? miejscowosc = $odjazd to $stacja_poczatkowa, a miejscowosc = $przyjazd to $stacja_koncowa questionmark.gif Opisuj to jakoś bardziej zrozumiale, bo jak zwykle nic nie rozumiem... tongue.gif
EliaS
wiec najpierw z tabeli miejscowosci wyciagam id tychze miejscowosci $odjazd to miejscowosc poczatkowa a $przyjazd to koncowa. Teraz z uzyskanego id zaznaczam dany odcinek w tabeli trasy na konkretnym kursie w sposob jak podalem w kodzie. Ale teraz zeby zaznaczyc caly odcinek miedzy stacja poczatkowa a koncowa musze chyba wyciagnac do dwoch zmiennych numery porzadkowe (numer poczatkowy i koncowy) ktore mam w osobnej kolumnie nr_porzadkowe i dopiero wtedy zaznaczyc w kolejnej tabeli rezerwacje dany caly odcinek pomiedzy tymi stacjami.
uufff kurde nawet nie wiecie jak czasem ciezko jest przekazac o co chodzi:) ale dzieki z gory za czas i pomoc.
cboot
[php:1:b3a4b94d4b]<?php
$city = "SELECT * FROM miejscowosci WHERE miejscowosc='$odjazd' || miejscowosc='$przyjazd'";
$do = mysql_query($city, $conn);
while ($result = @mysql_fetch_array($do))
{
$check = "SELECT * FROM trasy WHERE id_miejscowosci=$result[id] AND id_trasy='$trasa' ORDER BY nr_porzadkowy";
// ORDER po to, zeby nie trzeba bylo zgadywac, ktora jest ktora - tylko, zeby miec od razu w kolejnosci: stacja_poczatkowa, stacja_koncowa
$do1 = mysql_query($check, $conn);
$result1 = @mysql_fetch_array($do1);
$stacja_poczatkowa = $result1['nr_porzadkowy'];
$result1 = @mysql_fetch_array($do1);
$stacja_koncowa = $result1['nr_porzadkowy'];
?>[/php:1:b3a4b94d4b]
EliaS
Mam taki kod ktory mi pomagales:
[php:1:b7024db5ce]<?php
$city = "SELECT * FROM miejscowosci WHERE miejscowosc='$odjazd' || miejscowosc='$przyjazd'";
$do = mysql_query($city, $conn);
while ($result = @mysql_fetch_array($do))
{
$check = "SELECT * FROM trasy WHERE id_miejscowosci=$result[id] AND id_trasy='$trasa' ORDER BY nr_porzadkowy";

$do1 = mysql_query($check, $conn);
$result1 = @mysql_fetch_array($do1);

$stacja_poczatkowa = $result1[nr_porzadkowy];

$result2 = @mysql_fetch_array($do1);

$stacja_koncowa = $result2[nr_porzadkowy];

$select2 = "SELECT * FROM trasy WHERE id_trasy='$trasa' AND nr_porzadkowy BETWEEN '$stacja_poczatkowa' AND '$stacja_koncowa' ";
$do2 = mysql_query($select2, $conn);
while ($result3 = mysql_fetch_array($do2, $conn))
{
echo ("$result3[id_miejscowosci]");
$upd = "UPDATE rezerwacje SET miejsca = '$osoby' WHERE id_miejscowosci='$result3[id_miejscowosci]' AND data='$data'";
myslq_query($upd, $conn);
}
echo $stacja_poczatkowa;
echo $stacja_koncowa;
}

?>[/php:1:b7024db5ce]

Ale nie wykonuje mi tej ostatniej petli, a skolei calkowicie poza petla while wyciaga mi tylko jedna zmienna $stacja_koncowa wiec nie moge poza pierwsza petla wykonac tej ostatniej:(
EliaS
Nie wiem dlaczego nie wykonuje mi wogole zapytania z waunkiem WHERE i BETWEEN
[php:1:ec6cf692a6]<?php
$select2 = "SELECT id_miejscowosci FROM trasy WHERE id_trasy='$trasa' AND nr_porzadkowy BETWEEN '$stacja_poczatkowa' AND '$stacja_koncowa' ";

?>[/php:1:ec6cf692a6]

Jeśli usunę warunek BETWEEN to wykona mi petle z warunkiem WHERE id_trasy=$trasa, jesli usune wogole warunek dotyczacy id_trasy i wstawiam tylko BETWEEN to nic nie mam w wyniku. sad.gif
party
Było już tyle razy dukane, że wartości liczbowych w MySQL nie można obejmować apostrofami...
DeyV
Nie można? A to ciekawe. Dlaczego to niby?
EliaS
no juz ta ewentualnosc sprawdzalem, i fajnie by bylo gdyby faktycznie tak bylo z tymi apostrofami
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.