Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: otwarcie sesji w konstruktorze
Forum PHP.pl > Forum > PHP
koodlaty
Cóż - może jestem już zmęczony, może popełniłem jakiś oczywisty błąd, a może po prostu o czymś nie wiem. Tak czy siak nie działa mi kod tego rodzaju (kod uprościłem do postaci przedstawiającej esencje problemu):

  1. <?php
  2. if(!isset($_SESSION['obiekt']))
  3. {
  4. $obiekt = new klasa;
  5. $_SESSION['obiekt'] = $obiekt;
  6. }else
  7. $_SESSION['obiekt'] -> jakas_metoda();
  8.  
  9.  
  10. class klasa
  11. {
  12. function __construct()
  13. {
  14. }
  15.  
  16.  
  17. public function jakas_metoda()
  18. {
  19.  
  20. }
  21. }
  22. ?>


Dlaczego obiekt tworzony jest wciąż na nowo? Sprawdziłem – sesja uruchomiona jest prawidłowo, parser nie zgłasza błędów. Może ktoś mnie oświeci?
nospor
bo sesje sie staruje na poczatku skryptu a nie w konstruktorze
koodlaty
Cytat(nospor @ 12.09.2006, 13:42:08 ) *
bo sesje sie staruje na poczatku skryptu a nie w konstruktorze


A gdzie to jest powiedziane? Sesja powinna byś otwarta przed wysłaniem nagłówka.
nospor
Tego sie nie mowi glosno. To wyplywa z logiki tongue.gif

Zastanow sie. Teraz w skrypcie na poczatku sprawdzasz czy istniejesz obiekt w sesji. Jest tylko maly problem.... sesja nie zostala jeszcze wystartowana, wiec w sesji nic nie ma (wogole sesji nie ma).
Wiec logicznie rzecz biarac, zeby sprawdzic cos w sesji, trzeba najpierw ja wystartowac smile.gif
koodlaty
Cytat(nospor @ 12.09.2006, 13:48:41 ) *
Tego sie nie mowi glosno. To wyplywa z logiki tongue.gif

Zastanow sie. Teraz w skrypcie na poczatku sprawdzasz czy istniejesz obiekt w sesji. Jest tylko maly problem.... sesja nie zostala jeszcze wystartowana, wiec w sesji nic nie ma (wogole sesji nie ma).
Wiec logicznie rzecz biarac, zeby sprawdzic cos w sesji, trzeba najpierw ja wystartowac smile.gif


Tak na logike to mi to właśnie powinno działać.
Po kroku:

sesja nie istnieje, nie istnieje wiec obiekt - otrzymujemy false. Sprawdzamy zawartość pola w tablicy. Przecież jeśli nie istnieje pole o danym indeksie lub sama tablica otrzymujemy fałsz.
  1. <?php
  2. if(!isset($_SESSION['obiekt']))
  3. ?>


Skoro otrzymujemy false tworzony jest obiekt, w którym otwierana jest sesja. Sesja tworzona jest prawidłowo.
  1. <?php
  2. $obiekt = new klasa;
  3. ?>


Jeśli mamy już sesję zapisujemy do niej utworzony obiekt:
  1. <?php
  2. $_SESSION['obiekt'] = $obiekt;
  3. ?>


Od tej pory mamy sesję i obiekt w niej zapisany, kolejne wywołanie;
  1. <?php
  2. if(!isset($_SESSION['obiekt']))
  3. ?>

powinno zwrócić true

Gdzie leży błąd w tej logice?
nospor
Blad w tej logice jest taki, ze nie wiesz jak sie uzywa sesji w php. Jesli chcesz uzywac sesji, to session_start zawssze musi byc na poczatku skryptu, inaczej sesja wogole ci nie wystartuje, nawet pomimo tego iz poprzednim razem ci wystartowala w konstruktorze.
Uzywasz sesji - session_start() ma byc zawsze!!!
koodlaty
Cytat(nospor @ 12.09.2006, 14:11:36 ) *
Blad w tej logice jest taki, ze nie wiesz jak sie uzywa sesji w php. Jesli chcesz uzywac sesji, to session_start zawssze musi byc na poczatku skryptu, inaczej sesja wogole ci nie wystartuje, nawet pomimo tego iz poprzednim razem ci wystartowala w konstruktorze.
Uzywasz sesji - session_start() ma byc zawsze!!!


Chętnie bym Ci przyznał rację i miał święty spokój. Zrobiłem jednak eksperyment, który jak myślę udawania, że nie masz racji. Dlaczego poniższy kod działa zgodnie z oczekiwaniem a ten przedstawiłem na początku nie?

  1. <?php
  2. $a = 2;
  3. $b = 2;
  4.  
  5. $c = $a + $b;
  6.  
  7.  
  8. if(!isset($_SESSION['wynik']))
  9. {
  10. $_SESSION['wynik'] = $c;
  11. echo('nie bylo sesji - tworzymy');
  12. }else
  13. {
  14. echo($_SESSION['wynik'] . '<br />');
  15. echo('sesja istnieje');
  16. }
  17. ?>


Nigdzie nie doczytałem się też, że session_start ma się znajdować na samym początku. Z całą pewnością sesja musi zostać otwarta zanim wyślemy cokolwiek do przeglądarki ale nie na samym początku.
nospor
ten przyklad co pokazales wlasnie udowadnia ze mam racje smile.gif

Z mojej strony to tyle, reszta pozostawiam tobie. Przemysl sobie jeszcze raz wszystko pomalutku

edit: mowiac na poczatku skryptu, mam na mysli przed jakim kolwiek odwolaniem do $_SESSION. A skoro skrypt ma uzywac sesji to z reguly daje sie to na poczatku by se glowy nie zawracac pozniej w kodzie.
Co nie zmienia faktu ze Twoj pierwszy skrypt mial session_start juz po odwolaniu do $_SESSION przez co nie mial prawa dzialac poprawnie
koodlaty
faktycznie - kumam, thx smile.gif
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.