Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sklep] [koszyk] Zapamiętywanie koszyka na dłuższy czas
Forum PHP.pl > Forum > PHP
esiek
Mam taki problem. Prowadzę sklep WWW na własnym silniku. Koszyki klientów niestety szybko się wygaszają ponieważ zapisuję je w $_SESSION['costam']. Aby rozwiązać problem zacząłem każdy rozpoczęty koszyk z ostatnim stanem rejestrować w bazie danych MySQL. To działa bez zarzutu. Dzięki temu mam wgląd w niezrealizowane zakupy itp.

Aby zapamiętywać koszyki postanowiłem do $_COOKIE zapisać id aktualnej sesji które jest tożsame z id sesji w bazie danych.

Następnie wywołuje takie coś.

  1. <?
  2. public function openLastCart()
  3. {
  4.  
  5. global $cfg;
  6.  
  7. if(session_id()!==$_COOKIE['old_cart'] AND !empty($_COOKIE['old_cart']))
  8. {
  9.  
  10. $zapytanie = mysql_query("SELECT sesja, koszyk FROM koszyki WHERE sesja = '".$_COOKIE['old_cart']."' ORDER by id DESC LIMIT 1");
  11.  
  12. $znaleziono = mysql_num_rows($zapytanie);
  13.  
  14. if(!empty($znaleziono))
  15. {
  16. while($wiersz = mysql_fetch_array($zapytanie))
  17. {
  18. //przetwarzanie zawartosci mysql na tablice z koszykiem do zmiennej $towary_lista
  19. }
  20. }
  21. $_SESSION['costam'] = $towary_lista;
  22.  
  23. }
  24.  
  25. setcookie("old_cart", session_id(), time() + (86400 * 30 * 12), "/");
  26.  
  27. }
  28. ?>


W momencie jak ręcznie z przeglądarki kasuję id sesji to bez problemu przywraca mi stary koszyk. Jak zamknę na noc przeglądarkę to niestety po otwarciu WWW koszyk jest pusty.

Jakieś pomysły?

SmokAnalog
Coś tu dziwnie kombinujesz.

Cytat
Aby zapamiętywać koszyki postanowiłem do $_COOKIE zapisać id aktualnej sesji które jest tożsame z id sesji w bazie danych.


Przecież tak właśnie działa standardowa sesja w PHP, że w cookie zapisuje ID sesji. Nie zapisuj koszyka w cookie, tylko użyj normalnej sesji i ją skonfiguruj, albo zrób sobie własny mechanizm sesji. W danych sesji, czyli w plikach albo bazie danych, zapisz dane koszyka.
esiek
Cytat(SmokAnalog @ 30.01.2018, 23:47:33 ) *
Coś tu dziwnie kombinujesz.



Przecież tak właśnie działa standardowa sesja w PHP, że w cookie zapisuje ID sesji. Nie zapisuj koszyka w cookie, tylko użyj normalnej sesji i ją skonfiguruj, albo zrób sobie własny mechanizm sesji. W danych sesji, czyli w plikach albo bazie danych, zapisz dane koszyka.


Dziwnie? Dlaczego? Przeczytałeś cały mój post czy tylko powierzchownie rzuciłeś okiem? Dopisuję id sesji do ciastka o innej nazwie niż PHPSESSID ponieważ sesja wygasa, a ciastko pozostaje w komputerze użytkownika. Tym samym zapamiętuję w ciastku ID rozpoczętego koszyka, który jest w bazie danych. W przeciwnym wypadku po zamknięciu sesji nie mam szans odczytania ID bo generuje się nowe.
SmokAnalog
Sesja wygasa, bo masz ją źle skonfigurowaną - o tym mówię. Niepotrzebnie wprowadzasz zamęt tym używaniem standardowej sesji i własnej pseudo-sesji.
viking
Przyjrzyj się opcjom sesji w szczególności http://php.net/manual/en/session.configuration.php gc i lifetime. Koszyk dla zalogowanych możesz powiązać po id użytkownika. Do tego twój kod jest podatny na atak i wykorzystuje usunięte rozszerzenie mysql.
markonix
User wchodzi, generujesz mu CIASTECZKO z unikalnym ID np. md5 lub uniqid.
User dodaje cokolwiek do koszyka, pobierasz ID z ciasteczka i dodajesz do bazy wiersz z zawartością koszyka.
To samo robisz przy dodawaniu kolejnych, usuwaniu.

User zamyka stronę, wraca za 3 dni i nie ma żadnej różnicy, dalej widzi koszyk bo ciasteczko możesz i ustawić na bezterminowe. Jednakże ja bym tego nie robił na tak długo, max kilka dni.
Jeżeli user ma konto to zawartość koszyka nie przypisujemy do "ciasteczka" tylko do user_id. Tak samo jak robił zakupy i się zalogował to musimy przepisać (UPDATE) pod niego wiersze z koszykiem.
ZenekN
Cytat(markonix @ 31.01.2018, 12:06:04 ) *
User wchodzi, generujesz mu CIASTECZKO z unikalnym ID np. md5 lub uniqid.
User dodaje cokolwiek do koszyka, pobierasz ID z ciasteczka i dodajesz do bazy wiersz z zawartością koszyka.

oczywiście po wcześniejszej walidacji smile.gif

@esiek, unikaj kodu w stylu:
  1. $znaleziono = mysql_num_rows($zapytanie);
  2.  
  3. if(!empty($znaleziono))
  4. {

pisz
  1. if(!empty(mysql_num_rows($zapytanie))) {



//////////

pyton_000 aarambo.gif
Pyton_000
Jeśli już to starczy:

  1. if(!mysql_num_rows($zapytanie)) {


Tak poza tym to nie używamy już mysql_*
Pilsener
Cytat
Mam taki problem. Prowadzę sklep WWW na własnym silniku
- proponuję w takim razie zmienić silnik. Reanimowanie bez końca tego typu projektów to tylko strata czasu, jak byś nie kombinował i tak nie będzie dobrze działać.
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.