![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie.
Tworzę formularz koszyka. Po jego zatwierdzeniu do bazy sql powinny zostać wykonane 2 inserty: 1) ogólny o zamówieniu do tablicy 'zamowienia' 2) szczegółowy, listujący zamówione produkty do tablicy 'zam_produkty'. O ile z pierwszym nie mam problemu, to drugie nie wychodzi ![]() W formularzu mam pola: - id produktu - ilość zamówionych sztuk - cena. Dla każdego produktu powinien zostać wykonany insert 2) z odpowiednimi wartościami 'ilość' i 'cena'. Niestety coś mi nie wychodzi z pętlami, i insert zamiast być wykonany tyle razy, ile jest unikalnych produktów, jest wykonywany (dla 2 produktów, różnych cen i ilości) 8 razy...Wiem dlaczego, tylko nie wiem jak to naprawić - jakoś tablice wielowymiarowe nie są moją mocną stroną. Skrypt formularza: Skrypt przetwarzający:
Prawdopodobnie daję złe nazwy pól w formularzach (powinno być coś z []) albo z pętlą foreach...Albo z obiema kwestiami ![]() Prośba o pomoc ![]() Ten post edytował Kron 12.05.2008, 18:16:32 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 7 Dołączył: 4.05.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Czy cenę musisz przekazywać przez formularz? Ma to sens jedynie wówczas, gdy klient sam wpisuje sobie cenę, jaką chce zapłacić.
W przeciwnym wypadku nie potrzebujesz ani pola price, ani nawet prd, a jedynie pole z ceną, zawierające w nazwie id produktu:
W rezultacie w PHP $_POST będzie wyglądał tak, jakbyś utworzyl go w następujący sposób:
JL |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Jeśli zdarzy się sytuacja, że administrator strony zmieni cenę w tej samym czasie co Klient złoży zamówienie (między dodaniem do koszyka a zatwierdzeniem) to zmieni się cena w zamówieniu Klienta - a nie powinna.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Sorki, za OT, ale
1. Klient wrzuca coś do koszyka, cena wynosi X. 2. Przechodzi do płatności (w międzyczasie admin coś tam zmienił i cena się zmieniła). 2a. Pół biedy, jeśli cena zmalała. 2b. Jeśli cena jest większa niż ta, w momencie wrzucenia do koszyka, to możesz mieć nieprzyjemności z wymiarem sprawiedliwości. Cena od momentu wrzucenia czegoś do koszyka do płatności nie może być zmieniona. Jeśli wystąpi taka sytuacja, to należy przed płatnością poinformować klienta o takiej sytuacji i zaproponować produkt zastępczy lub umożliwić usunięcie / potwierdzenie zmiany ceny. -------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
I właśnie dlatego chcę przenosić cenę z momentu złożenia zamówienia do bazy danych - żeby taka sytuacja nie zaistniała
![]() |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
No to kilka porad dotyczących systemów e-commerce.
Koszyk Możesz rozwiązać problem na dwa sposoby: 1. Trzymasz koszyk w sesji. 2. Trzymasz koszyk w bazie. W koszyku trzymasz wszystko - nazwa, opis, cena, itd. Daje to gwarancję, że w przypadku zmiany, klient ma ten sam koszyk. Oba rozwiązania mają swoje wady i zalety. Jakie, to już musisz poszukać w necie (temat rzeka). Zmiana ceny Jeśli w jakiś sposób cena ulegnie zmianie w trakcie sesji kupowania (klient ma w koszyku produkt, którego cena się zmieniła), masz dwie możliwości: 1. Klient kupuje produkt za kwotę, jaka była w momencie wrzucenia do koszyka. 2. Klientowi wyświetla się informacja o zmianie w produkcie, który ma koszyku i dostaje możliwość wyboru - usuń z koszyka / akceptuj zmiany. Z doświadczenia wiem, że opcja 2 jest bardzo niepożądana (wyjątkiem są bardzo specyficzne rodzaje produktów). -------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
OK. Rozwiązanie przyjąłem już takie:
- koszyk do momentu akceptacji przez Klienta (zakończenia zamówienia) jest trzymany w sesji - w momencie akceptacji jest przenoszony do bazy. I tu właśnie pojawia się problem tej tablicy ![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Nie trzymaj w koszyku id produktu i id zamówienia.
W koszyku przechowuj całą informację o produkcie (nazwa, opis, cena, produkty powiązane, itd). Dopiero w momencie składania zamówienia tworzysz nowe zamówienie. -------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 7 Dołączył: 4.05.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Przekazywanie ceny w formularzu jest bardzo poważną luką bezpieczeństwa, gdyż pozwala klientowi dowolnie nią manipulować.
Czy będziesz honorować zamówienia, w których klient sam sobie ustalił cenę? Jak mu to udowodnisz? Rozwiązaniem problemu zmieniających się w czasie cen jest trzymanie historii ich zmian i umieszczenie w formularzu id danej ceny (a dokładnie: jakiegoś hasha), po którym będzie można na serwerze sprawdzić, która cena obowiązywała, gdy klient się na nią zgadzał. JL |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Zauważ że cenę przekazuję w formularzu jako readonly, Klient nie ma bezpośredniej możliwości ingerencji - chyba że istnieją opcje zmiany poprzez jakiś injection.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 7 Dołączył: 4.05.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Przy projektowaniu aplikacji zawsze przyjmuj założenie, że jeżeli coś znajduje się w przeglądarce, to użytkownik może z tym zrobić WSZYSTKO.
Istnieje nieskończona liczba sposobów, żeby zaingerować w treść strony. Pierwsze trzy, które przychodzą mi do głowy (i które powinien mieć zainstalowane każdy programista) to FireBug, GreaseMonkey oraz Web Developer Toolbar. JL |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
OK, kwestia bezpieczeństwa jest istotna, ale póki co nie o to mi chodzi. Wracając do mojego pytania: co jest nie tak w kodzie, że nie przekazuje wszystkich trzech parametrów w tablicy?
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 7 Dołączył: 4.05.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli przekazujesz $prd w price[$prd] i qty[$prd], to nie jest potrzebne w osobnym polu "prd[]".
Zrób dwa pola: $_POST będzie wyglądał następująco:
A potem zrób tak:
Oczywiście trzeba sprawdzić, czy dane nadają się do wrzucenia do zapytania (np. przy użyciu mysql_real_escape_string()), ale Ty nie baczysz na bezpieczeństwo. Zatem jak już skończysz ten sklep, to wrzuć tu namiar - chętnie zrobię w nim zakupy ;-) JL |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 29.06.2025 - 08:24 |