[php]Przechowywanie zawartości koszyka.

0

Witam, pare miesiecy temu nikt nie odpowiedzial na pytanie jak przechwowyac koszyk sklepu netowego http://4programmers.net/Forum/viewtopic.php?id=45771&post=102767#102767 ale teraz tak sobie mysle czy nie fajnie byloby zrobic to na bazie.
Np.
Klient sie loguje otrzymując unikalna nazwe (jakies id) teraz zamawiajac do tabeli wpisuja sie poszczegolne produkty i jego id; teraz jak chce wystwietlic swoj koszyk to tylko:
select * from koszyk where id=lalala i juz.
Natomiast po nacisnieciu przycisku wyslij zamowieniu w ktoryms etapie kiedys zamowienie juz jest wyslane kasujemy wpisy tego usera np:
delete from koszyk where id=lalala.
Zaleta tego sposobu jest mozliwosc kontynuacji zamowienia np po wylaczenie kompa luz tez po przejsciu do innego kompuytera bo id tego usera zawsze bedzie ten sam a produkty sie nie wykasuja.
Teoretycznie wydaje mi sie ten sposob jako bardzo dobry ale wiadomo praktyka zawsze jest inna.
Co Wy myslicie na ten temat ?
Ktos tego juz probowal ?

0

Ja zrobiłem koszyk na bazie danych. Jest to rozwiązanie bardzo dobre, wygodne i bezpieczne. Tabela w takim koszyku może wyglądać mniej więcej tak:

CREATE TABLE shopping_cart (
  id int(4) DEFAULT '0' NOT NULL auto_increment,
  session_id varchar(32) NOT NULL,
  product_id int(10) NOT NULL,
  quantity smallint NOT NULL,
  PRIMARY KEY (id)
);

Wystarczy tylko generować sobie id sesji. Np tak:

 if(!isset($_['cart_session_id'])) { 
     $session_id = md5(uniqid(rand())); 
     setcookie('cart_id', $session_id, strtotime('+10 minutes')); 
 } else { 
     $session_id = $_COOKIE['cart_session_id']; 
 } 

Na http://www.zend.com masz świetny artykuł (A PHP based shopping cart), w którym znajdziesz większość odpowiedzi jak zbudowac dobry koszyk. Jednak opisany tam skrypt z założenia jest tylko przykładem i nie nadaje się do dużych rozwiązań. (poza tym niektóre zapytania nie działają).
Brakuje mu tzw: garbage_collection - czyli usuwanie nieaktualnych rekordów z bazy. Ale to już jest drobnostka i łatwo to zrealizować :)
</url>

0

Wystarczy tylko generować sobie id sesji. Np tak:

 if(!isset($_['cart_session_id'])) { 
     $session_id = md5(uniqid(rand())); 
     setcookie('cart_id', $session_id, strtotime('+10 minutes')); 
 } else { 
     $session_id = $_COOKIE['cart_session_id']; 
 } 

A np jezeli sklep bedzxie zakladal ze osoby beda musialy sie zalogowac przed mozliwoscia robienia zakupow to wydaje mi sie ze sesje nie beda potrzebne. Jest bazka z userami, sprawdzanie haselka jezeli oki to pamietamy id jakos zahaszowany (zeby nie bylo mozliwosci zmiany id z paska ) i juz.
Dobrze mi sie wydaje? :)

0

To już twoja brocha jak to rozwiazesz. Mozna to zintegrować :)

0

dobra to jak teraz zrobic zeby php i baza pamietala usera nie uzywajac sesji. tylko prosze o wyczerpujacy opis :) jesli mozna

0

Tylko wtrącę, że jak robiłem sklep internetowy na zaliczenie (ASP) to koszyk zrobiłem na cookies - wg mnie o wiele lepsze rozwiązanie od bazy. Już to gdzieś na forum pisałem - wybrałem ciacha po podwiedzeniu kilku sklepów - tam też mieli ciacha.

Jeśli user zamknie przeglądarkę i potem wróci nadal w koszu ma to, co wybral wcześniej. A w bazie to co - po opuszczeniu przez klienta trzeba wyczyścić bazę, bo inaczej by się zapchała niezrealizowanymi zamówieniami.

W sumie, to jeśli chcesz, to mógłbym Ci przesłać cały ten sklep (przypominam, że w ASP, ale jest tak banalny, że łatwo zrozumieć) - testowałem wielokrotnie i nie zauważyłem anomalii. (5.0 za to jakby co :))

0

dobra to jak teraz zrobic zeby php i baza pamietala usera nie uzywajac sesji. tylko prosze o wyczerpujacy opis :) jesli mozna

Oczywiscie ze mozna
Wiec po kolei, tabela users zawiera np 3 pola id,nick,haslo.
Jezeli mamy do dyspozycji sesyjke to wiadomo klient sie oguje ma id sesji i sprawa zalawiona ale np bez sesji.
Zrobilem forum moja metoda nie wiem dokladnie jak to szlo ale chyba za pomoca formualarza przesylalem zahaszowanego nicka np link:

<a href=llalalaaa.php3?id=ab56665a66677bd8888>

caly czas to id jest przesylane czy to za pomocja linka czy to samo pomoca pola hidden. Za kazdym kliknieciem mozna sprawdzac czy faktycznie z paska nie zmieniono i wtedy jezeli ktos pokombinuje w pasku inny kodzik to pojawia sie ekran logowania.
Caly ten mechanizm dziala przy zalozeniu ze nick jest unikalny.
A zreszta spokojnie mozna przeslac id zeby sie nie pojawial na pasku a ze ktos go odczyta to przeciez nic to nie zmieni.
Tylko pytanie jest takie : jakie jest prawdopodobienstwo ze osoba ktora wpisze ciag zahaszowany trafi akurat w ciag ktory istnieje. Mysle ze prawdopod. jest rowne 0. Cyfr jest ponad 10 iu na kazdej pozycji moze byc od 0 do F.

Chodz tu uwaga!
Jest to metoda bezpieczna ale nie do konca. Poniewaz jezeli ktos zna kogos nicka moze sobie wygenerowac hasz tego nicka i go wpisac.
Czyli poprawiajac tok myslenia dodajemy dodatkowe pole jak np hash_nick i tu zapisujemy zahaszowanego nicka np tak:
password(nick) * 21 +7
i pozniej sprawdzamy tylko wg tego wzoru czy to ten gosc.

Taki troszke zakrecony sposob ale funkcjonuje.
Co Wy na to ?

Tylko wtrącę, że jak robiłem sklep internetowy na zaliczenie (ASP) to koszyk zrobiłem na cookies - wg mnie o wiele lepsze rozwiązanie od bazy. Już to gdzieś na forum pisałem - wybrałem ciacha po podwiedzeniu kilku sklepów - tam też mieli ciacha.

Jeśli user zamknie przeglądarkę i potem wróci nadal w koszu ma to, co wybral wcześniej. A w bazie to co - po opuszczeniu przez klienta trzeba wyczyścić bazę, bo inaczej by się zapchała niezrealizowanymi zamówieniami.

W sumie, to jeśli chcesz, to mógłbym Ci przesłać cały ten sklep (przypominam, że w ASP, ale jest tak banalny, że łatwo zrozumieć) - testowałem wielokrotnie i nie zauważyłem anomalii. (5.0 za to jakby co :))

ok sposob dobry nie mowie ze nie. Ale jak zablokuje cookie a znam takich co maja wyl. wszystkie cookie to kapa.
A odnsnie bazy wcale sie nie bedzie zapychala zamowieniami bo mozna zrobic tak ze podczas wejscia do zamowienia bedzie wykonywane zapytanie ktore sprawdzi czy w bazie sa rekordy a dacie iinnej niz dzis, jezeli tak to kasuj je. Albo jakos to pozniej ulepszyc zeby ten proces powtarzal sie tylko pwoiedzmy raz dziennie.

0

Cookies wcale nie są takie najlepsze. Rozwiązując to za pomocą bazy zyskujesz elastyczność i większą wygodę. Co do tego, że jeśli zamówione produkty są w cookie i można do nich wrócić np. za pare godzin. To samo da się zrobić na bazie ustawiając w tabeli pole session_expires na np 5 godzin.

Wracając do Gliny :)
Wygeneruj hash hasła takim sposobem, jak wyżej pokazałem (możesz przerobić, żeby generował hash np na podstawie IP usera). Potem przechowuj ten hash w cookie. Ryzyko, że ktoś to podejrzy i wygeneruje sobie identyczny id jest nikłe.

Pozostaje problem tych, którzy blokują cookies... na szczęście nie jest ich zbyt wielu :)

0

dobra to jak teraz zrobic zeby php i baza pamietala usera nie uzywajac sesji. tylko prosze o wyczerpujacy opis :) jesli mozna

à propos sesji tak mi sie przypomnialo, kiedys chodzilismy z kumplem na stronie www.sympatia.pl i przeklejalismy sobie adresy w ktorych byly id sesji. I nagle ku zdziwieniu kumpla nagle zobaczyl w skrzynce moje wiadomosci , okazalo sie ze jak mu przeklleilem linka wszedl na moje konto :)
Czasami sie udawalo w ten sposob zalogowac a czasami nie takze te sesje chyba tez nie do konca. Ale fakt jest taki ze mowimy o ekstremalnych przypadkach ale chyba wlasnie takie przypadki trzeba eliminowac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1