Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] zapis koszyka do bazy danych MySQL
Forum PHP.pl > Forum > PHP
kinimod1987
Witam wszystkich.
Oto mój koszyk na zakupy smile.gif
  1. <?php
  2.  
  3. //session_destroy();
  4. echo "<html><head><meta http-equiv='content-type' content='text/html; charset=utf-8' /></head><body>";
  5.  
  6.  
  7. require('szablon_koszyk.php');
  8.  
  9. ?><div id="TRESC"><?php
  10. if(!isset($_SESSION['koszyk'])) $_SESSION['koszyk']=array(); //sprawdzam czy jest koszyk
  11.  
  12.  
  13. echo 'Twoje wybrane produkty: '.'<br>';
  14.  
  15. if(isset($_GET['idgra'])){
  16. $tmp=array('nazwa'=>$_GET['nazwa'],'kategoria'=>$_GET['kategoria'],'platforma'=>$_GET['platforma'],'cena'=>$_GET['cena'], );
  17.  
  18.  
  19. if(array_key_exists($_GET['idgra'], $_SESSION['koszyk'])) echo 'Istnieje już w koszyku gra o podanym id'.'<br>';
  20. else $_SESSION['koszyk'][$_GET['idgra']]=$tmp;
  21. }
  22.  
  23.  
  24. echo '<form action="usun.php" method="POST">';
  25. foreach ($_SESSION['koszyk'] as $sub => $key)
  26. echo 'identyfikator gry: '.$sub.' nazwa: '.$key['nazwa'].' kategoria: '.$key['kategoria'].' platforma: '.$key['platforma'].'<font color="red">'.' cena: '.'</font>'.$key['cena'].' <input type="submit" name="'.$sub.'" value="usuń"<br /><hr />';
  27.  
  28. echo '</form>';
  29.  
  30.  
  31.  
  32. //zliczam ile zostało produktów w koszyku
  33. foreach ($_SESSION['koszyk'] as $sub => $key){
  34. $iloscproduktow++;
  35. }
  36.  
  37. // obliczam sumę produktów
  38. $suma=0;
  39. foreach ($_SESSION['koszyk'] as $sub => $key) $suma+=$key['cena'];
  40. echo 'Łączna suma do zapłaty: ';
  41. $format_suma = number_format($suma, 2, '.', '');
  42. echo $format_suma.'<br>';
  43. echo 'Ilość produktów w koszyku: ';
  44.  
  45.  
  46.  
  47. if($iloscproduktow==0){
  48. echo 'brak produktów'.'<br>';
  49. $_SESSION['ilosc']=$iloscproduktow;}
  50. else{
  51. echo $iloscproduktow;
  52. $_SESSION['ilosc']=$iloscproduktow;}
  53.  
  54. ?></div>
  55. <?php
  56. ?>


Pozostało mi tylko zapis mojego zamówienia do bazy danych MySQL . Tutaj pojawia się problem bo nie mam pojęcia jak to zrobić.
Stworzyłbym tabelę 'zamowienia' i tam przechowywałbym id_zamowienia, nazwy produktów, cene, date_zamowienia i id_uzytkownika. Na stronie posiadam system logowania i nazwa_uzytkownika trzymam w sesji.

Jest ktoś w stanie mi pomóc bądź nakierować jak to zrobić questionmark.gif
Dziękuję i pozdrawiam.
masahuku
No to zależy jak obsługujesz bazę. Najlepiej byłoby przez PDO przekazać obiekt(-y) do bazy. Musisz mieć tabelę, w której trzymasz zamówienia i tam to dodajesz.

Co do struktury bazy (póki nie zamierzasz wykorzystywać jej jako DW) to musisz ją znormalizować - nazwa produktu nie może się pojawić w zamówieniu (tylko jego id jako klucz obcy).
kinimod1987
Stworzyłem sobie coś takiego:

  1. foreach ($_SESSION['koszyk'] as $sub => $key){
  2. echo 'identyfikator gry: '.$sub.' nazwa: '.$key['nazwa'].' kategoria: '.$key['kategoria'].' platforma: '.$key['platforma'].'<font color="red">'.' cena: '.'</font>'.$key['cena'].'<hr>';
  3. $zapytanie = "INSERT INTO `zamowienia` (`idzamowienia`, `nazwa_uzytkownika`, `idgra`, `suma` , `data_zamowienia`) VALUES ('', '$_SESSION[prawid_uzyt]', '$sub', '$key[cena]', '$data_zamowienia')";
  4.  
  5.  
  6. $db->query("SET NAMES 'utf8'");
  7. $wynik = $db->query($zapytanie);}

nazwa_uzytkownika jest unikatowa więc to tak jakby tam było id_uzytkownika.
Wszystko fajnie tylko że jak kliknę przycisk złóż zamówienie i w koszyku mam np.3 produkty to w bazie danych pojawiają mi się 3 rekordy.
Czy istnieje taka możliwość by w jednym rekordzie trzymać takie 3 zamówienia. questionmark.gif np:
idzamowienia:1
nazwa_uzytkownika: xxxxxx
idgra: 15, 17, 45
suma: 340zł
data_zamowienia: xxxx-xx-xx
Czyli użytkownik zamówił trzy produkty i wszystko jest w jednym zamówieniu .
Czytałem trochę o PDO ale termin zbytnio nagli więc nie mam czasu obecnie by uczyć się czegoś nowego. a co oznacza skrót DW smile.gif questionmark.gif
altruista2
Lepiej zrobić tabelę "zakupy" z kolumnami idzamowienia, sztuk, ID produktu, Cena i w tabeli "zamowienia".
Znacznie bardziej funkcjonalne, np. potem można prowadzić z tego różne statystyki i wiele innych. Poza tym jest szybsze IMHO

Teoretycznie mógbyś trzymać cały koszyk w zamowieniach w formacie "id1,cena1,sztuk1|id2,cena2,sztuk2|id3,cena3,sztuk3(...)" ale to jest mało eleganckie...
R4D3K
Po pierwsze masz trochę nie optymalny kod zliczenia ilości towarów jak i obliczanie wartości zamówienia można zrobić w jeden pętli foreach a nie w 2 !
Po drugie źle się do tego zabierasz.
Masz w bazie tabele produkt w którym każdy produkt ma swoje unikalne id powiedzmy idproduct, każdy user ma też swoje id.
Więc tworzymy tabele zamówienia w którym zawrzesz datę zamówienia adres wysyłki rodzaj płatności id klineta itp:
idzamowienia,przesylka,user_iduser .... (user_iduser jest kluczem obcym który powinien łączyć się z id w tabeli userzy)
dodatkowo w tabeli zamowienia tworzysz klucz obcy id_zamowione_produkty
i tworzysz tabele pomocnczą, która zawiera id produktu zamówionego oraz id danego zamowienia:
zamowienia_idzamowienia , product_idproduct
W ten sposób otrzymasz dobrze znormalizowaną bazę danych ponieważ nie powielasz nazw i innych danych dotyczących produktów itp.
Pamiętaj o otworzeniu odpowiednich więzów integralności ( ALTER TABLE ADD CONSTRAINT ..... ), wtedy możesz się zabezpieczyć przed usunięciem danego produktu z tabeli produts gdzy dany towar jest zamówiony itp.
kinimod1987
dziękuję wszystkim za odpowiedź ale moje pytanie brzmiało inaczej.
Może i moje rozwiązanie co do tabeli nie jest optymalne ale chciałbym najpierw to zrobić na moim przykładzie bo ja nadal nie wiem jak to zapisać w kodzie by mi tak zapisywało jak chce.
Przy rejestracji użytkownika , zbieram wszystkie dane potrzebne do wysyłki i nazwa_uzytkownika jest unikalna więc nie mogą istnieć dwa takie same loginy w bazie. To jest taki mój id_user smile.gif natomiast idgra to nic innego jak id_produkt.
Cytat
Po pierwsze masz trochę nie optymalny kod zliczenia ilości towarów jak i obliczanie wartości zamówienia można zrobić w jeden pętli foreach a nie w 2 !

To prawda smile.gif nawet tego nie zauważyłem smile.gif
Cytat
Teoretycznie mógbyś trzymać cały koszyk w zamowieniach w formacie "id1,cena1,sztuk1|id2,cena2,sztuk2|id3,cena3,sztuk3(...)" ale to jest mało eleganckie...

Jak to zapisać w postaci kodu questionmark.gif Mógłbym ograniczyć że użytkownik może przechowywać tylko 5 produktów w koszyku i wstawić tylko 5 produktów do bazy .
Interesuje mnie na razie jakiś prosty sposób. Nie musi być jak najbardziej optymalny.
Pozdrawiam
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.