Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formularz php i tablice wielowymiarowe
Forum PHP.pl > Forum > PHP
Kron
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 sad.gif
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:
  1. <input type='hidden' name='prd[]' value='$prd'>";
  2. <input type='hidden' name='price[$prd]' value='$price'>";
  3. <input type="text" readonly size="3" name="qty[$prd]" value='$ilosc' />

Skrypt przetwarzający:
  1. <?php
  2. foreach ($_POST['prd'] as $zam_prd_id) 
  3. {
  4. $zam_prd_qty=$_POST['qty['.$zam_prd_id.']'];
  5. $zam_prd_price=$_POST['price['.$zam_prd_id.']'];
  6. $query_zam_det=query(&#092;"INSERT INTO map_zam_prd VALUES ($zam_id,$zam_prd_id,$zam_prd_qty,'$zam_prd_price')\");
  7. }
  8. ?>


Prawdopodobnie daję złe nazwy pól w formularzach (powinno być coś z []) albo z pętlą foreach...Albo z obiema kwestiami winksmiley.jpg
Prośba o pomoc smile.gif
jacekl
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:

  1. <input type="text" readonly size="3" name="price[$prd]" value='$ilosc' />


W rezultacie w PHP $_POST będzie wyglądał tak, jakbyś utworzyl go w następujący sposób:
  1. <?php
  2. $_POST["price"][prd1] = ilosc1;
  3. $_POST["price"][prd2] = ilosc2;
  4. $_POST["price"][prd3] = ilosc3;
  5. ?>


JL
Kron
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.
batman
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.
Kron
I właśnie dlatego chcę przenosić cenę z momentu złożenia zamówienia do bazy danych - żeby taka sytuacja nie zaistniała smile.gif
batman
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).
Kron
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 sad.gif Mam id zamówienia, mam id produktu, nie mogę wyciągnąć dla każdego z produktów jego ilości i ceny, trzymanych w formularzu.
batman
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.
jacekl
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
Kron
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.
jacekl
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
Kron
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?
jacekl
Jeżeli przekazujesz $prd w price[$prd] i qty[$prd], to nie jest potrzebne w osobnym polu "prd[]".
Zrób dwa pola:
  1. <input type='hidden' name='prd[$prd]["price"]' value='$price'>";
  2. <input type="text" readonly size='3' name='prd[$prd]["qty"]' value='$ilosc' />


$_POST będzie wyglądał następująco:
  1. <?php
  2. $_POST["prd"][id1]["price"] = "x1";
  3. $_POST["prd"][id1]["qty"] = "x2";
  4. $_POST["prd"][id2]["price"] = "x3";
  5. $_POST["prd"][id2]["qty"] = "x4";
  6. ?>


A potem zrób tak:
  1. <?php
  2. foreach ($_POST['prd'] as $k=>$v) 
  3. {
  4. $query_zam_det=query("INSERT INTO map_zam_prd VALUES ($zam_id, $k, $v["qty"], $v["price"]);
  5. }
  6. ?>


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
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.