Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: koszyk na zakupy na sesjach
Forum PHP.pl > Forum > PHP > Object-oriented programming
Olimpia_ona
Witam,
pisałam już kiedyć o koszyku. Wszystkie problemy z nim związane rozwiązałam i wydawało mi się, że już wszystko jest ok, ale zapomniałam zmienić ustawień serwera na register_globals = off, po tej zmianie nie trzyma mi tego koszyka. Nie pamięta zmiennej $stan, co wydaje się być logiczne, ale teraz proszę o pomoc, co muszę zrobić, by jednak ten koszyk działał z register_globals = off.

Fragment jak mam to zrobione:
  1. <?php
  2. ...
  3. $koszyk=$_SESSION['koszyk'];
  4. $dodaj=$_GET['dodaj'];
  5. $usun=$_GET['usun'];
  6. $zmien=$_GET['zmien'];
  7. $first=$_GET['first'];
  8. ...
  9. class koszyk 
  10. { 
  11. /* tablica asocjacyjna zawierajaca stan koszyka */ 
  12. /* klucz, to wartosc id produktu, wartosc to ilosc elementow */ 
  13. var $zawartosc; 
  14.  
  15. function dodaj($element, $ilosc) 
  16. { 
  17. $this->zawartosc[$element] += $ilosc; 
  18. } 
  19.  
  20. function usun($element, $ilosc) 
  21. { 
  22. if ($this->zawartosc[$element] > $ilosc) 
  23. $this->zawartosc[$element] -= $ilosc; 
  24. else 
  25. unset($this->zawartosc[$element]); 
  26. } 
  27.  
  28. function zmien($element, $ilosc) 
  29. { 
  30. $this->zawartosc[$element] = $ilosc; 
  31. } 
  32.  
  33. function stan() 
  34. { 
  35. return $this->zawartosc; 
  36. } 
  37. } 
  38.  
  39. if (!$koszyk) 
  40. $koszyk = new koszyk; 
  41. ...
  42. if ($dodaj) 
  43. $koszyk->dodaj($dodaj1, 1); //dodaj($element, $ilosc) - dodaje $ilosc $elementow do koszyka
  44. ...
  45. session_register('koszyk');
  46.  
  47. $stan = $koszyk->stan(); //zwraca zawartosc w postaci hasza
  48. ...
  49. //i wyświetlanie koszyka
  50. if ($stan) 
  51. {
  52.  $ilewkosz=0;
  53.  while (list($key, $value) = each($stan))
  54.  { 
  55.  echo "produkt: $key ilość:$value<br />";
  56.  }
  57. }
  58. ?>


próbowałam robić coś w stylu:
$stan=$_SESSION['stan'];
session_register("stan");

ale to nie pomogło.
domis86
hmmm
Musisz bardziej zgłębić wiedzę o sesjach.

http://pl.php.net/manual/sv/function.session-register.php

tu czytamy:

Observera
If you are using $_SESSION (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister().






także po pierwsze: wyeliminuj session_register z tego skryptu i dopiero możemy rozmawiać aarambo.gif

(uzywaj tylko $_SESSION[$cos] = $x oraz $x = $_SESSION[$cos] )
Olimpia_ona
Cytat(domis86 @ 15.06.2007, 11:16:56 ) *
Observera If you are using $_SESSION (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister().
także po pierwsze: wyeliminuj session_register z tego skryptu i dopiero możemy rozmawiać aarambo.gif

(uzywaj tylko $_SESSION[$cos] = $x oraz $x = $_SESSION[$cos] )


Dziękuje, nie wiedziałam o tym, chyba rzeczywiście będe musiała pogłębić swoją wiedzę (ale w sumie myśle, że robie to cały czas smile.gif )

Niestety zlikwidowanie session_register nic nie pomogło. Wpisałam nawet
  1. <?php
  2. $_SESSION['stan'] = $koszyk->stan();
  3. $stan=$_SESSION['stan']; //tutaj próbuje to przypisać do normalnej zmiennej, bo w zbyt wielu miejscach na s
    tronie już z niej kożystam.
  4. ?>
likemandrake
Witam

To co tu napisze, bedzie dotyczyc kodu z Twojej pierwszej wypowiedzi w tym poscie, a wiec...

Usuwasz linie 46
Miedzy linie 58, a 59 wstaw: $_SESSION['koszyk']=$koszyk;

Mysle ze powinno dzialac, ale nie jestem kompilatorem, jak co to bedziemy dalej kombinowac smile.gif
Przeczytaj to
Wyraznie jest opisany Twoj problem w bloku Uwaga

Jak zapewne widzisz, do zmiennej sesyjnej zostaje zapisany caly obiekt klasy, mysle ze lepszym rozwiazaniem byloby zapisanie tablicy z samym stanem koszyka, przy kazdym wywolaniu skryptu, zawsze bylby w takim razie tworzony obiekt klasy koszyk i dolaczany do niego aktualny stan koszyka pobrany ze zmiennej sesyjnej.

Jeszczed lepszym rozwiazaniem bedzie utworzenie tabeli w bazie danych, ktora to moglaby trzymac niezatwierdzony stan koszyka, a dopiero potem jak koszyk zostaje zatwierdzony, to po zweryfikowaniu danych, dane sa te przeniesione do odpowiedniej tabeli - tabeli zamowien, gdzie beda juz trzymane ostateczne dane.

Trzymanie calej zawartosci obiektu w sesji nie jest bezpiecznym rozwiazaniem, wystarczy ze ktos przelapie SID uzytkownika X i w tym momencie ten uzytkownik ma wszystko to co zrobil użytkownik X, czyli aktualny stan koszyka, itp. Mam nadzieje, ze jakos zabezpieczasz sie przed tego typu defektami smile.gif

Pozdrawiam serdecznie smile.gif
domis86
Cytat(likemandrake @ 16.06.2007, 00:06:47 ) *
Trzymanie calej zawartosci obiektu w sesji nie jest bezpiecznym rozwiazaniem, wystarczy ze ktos przelapie SID uzytkownika X i w tym momencie ten uzytkownik ma wszystko to co zrobil użytkownik X, czyli aktualny stan koszyka, itp. Mam nadzieje, ze jakos zabezpieczasz sie przed tego typu defektami smile.gif

Co ty za farmazony opowiadasz?
Przeciez dane w sesji nie są widoczne przez usera nawet jak ma SID.
Jak ma SID to znaczy ze system uwaza go za tego usera, ktorego id jest zapisane w sesji i tyle aarambo.gif
Takze nie siej paniki
Sedziwoj
@likemandrake
Cześć tych informacji było wcześniej podana.

@domis86
Czytaj uważnie, nie mowa jest o dostępie bezpośrednim do danych w sesji a o zawartości koszyka.

A co do serialize i unserializ to przy obiektach trzeba uważać, bo obsługę tego powinien zapewnić autor klasy, tylko że to wymaga wiedzy o tym co powinno się robić. Do tego przy unserializ'owaniu skrypt musi mieć dostęp do definicji klasy obiektu.

Do tego o koszyku i sesji był już temat, więc wystarczy poszukać.
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.