Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [sklep] [koszyk] Zapamiętywanie koszyka na dłuższy czas
esiek
post
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 6.11.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
SmokAnalog
post
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
esiek
post
Post #3





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 6.11.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post
Post #5





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
markonix
post
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
ZenekN
post
Post #7





Grupa: Zarejestrowani
Postów: 419
Pomógł: 5
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/aarambo.gif)

Ten post edytował ZenekN 1.02.2018, 13:35:11
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Jeśli już to starczy:

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


Tak poza tym to nie używamy już mysql_*
Go to the top of the page
+Quote Post
Pilsener
post
Post #9





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 04:27