Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Session Handler - powrót do domyślnego
Walian
post 23.08.2009, 21:37:56
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 1
Dołączył: 13.07.2009

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


Ustawiłem własny Handler do sesji - wszystko zapisuje się do bazy danych.
Niestety w pewnej sytuacji potrzebuję ustawić dane sesji do bazy danych, a potem powrócić do domyślnej obsługi i zapisać dane do pliku. Niestety nie wiem jak przywrócić domyślny Session Handler.
Czyli schemat działania:

1.) Zmiana Handlera na nowy.
2.) Zapis danych sesji (do bazy danych).
3.) Odczyt (weryfikacja).
4.) Zakończenie pracy.
5.) Powrót do domyślnej obsługi (domyślny Handler).
6.) Zapis danych sesji.
7.) Odczyt (weryfikacja).
4.) Automatyczne zakończenie pracy.

Do tej pory robiłem coś takiego:

  1. // Tutaj praca z sesją przy z nowym Handlerem (Baza danych).
  2. session_write_close(); // Myślałem, że to wystarczy by PHP powróciło do domyślnej obsługi
  3. // Tutaj praca z domyślnym Handlerem (Pliki).


ale wstawia dane do bazy danych zamiast do plików.

Czy mi się dobrze wydaje - ustawienie nowego Handlera działa na stałe - nie do zakoczenia sesji/skryptu?

Ten post edytował Walian 23.08.2009, 21:38:39
Go to the top of the page
+Quote Post
erix
post 23.08.2009, 21:44:07
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Niestety w pewnej sytuacji potrzebuję ustawić dane sesji do bazy danych, a potem powrócić do domyślnej obsługi i zapisać dane do pliku.

To nie możesz sprawdzać odpowiedniego warunku przy write danego handlera...? Po co do muchy z armaty? tongue.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Walian
post 24.08.2009, 20:00:41
Post #3





Grupa: Zarejestrowani
Postów: 124
Pomógł: 1
Dołączył: 13.07.2009

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


Czyli Tobie chodzi o to, bym mojego handlera przerobił tak, by zapisywał/odczytywał dane zarówno z bazy danych jak i z plików, w zależności co wybiorę w danym momencie. Ale moim zdaniem to jest właśnie "wyjazd z armaty" tongue.gif Bo wychodzi na to, że musiałbym przerobić nieco klasę w której mam handlera, ale to więcej roboty niż przywrócenie na chwilę domyślnego handlera (o ile to możliwe).

Tak poza tym to - sesje mi są potrzebne tylko do logowania, natomiast zapis do pliku tylko przy rejestracji konta - po to, by używając przycisku "< Popraw dane" (pisałem o tym tu) usera przeniosło spowrotem na formularz, który wypełniał i aby został on (formularz tongue.gif) wypełniony. Niestety jeśli również i te dane miałyby być zapisywane do bazy to pole z wartościami dodatkowymi (te, które są serializowane) musiałoby mieć jeszcze dłuższą wartość - a po cholerę?

Tak więc da się powrócić do domyślnego handlera czy nie?

## Dodane 24.08.2009 21:00:

Dobra pokombinowałem trochę, ale nic to nie dało. Napisałem sobie osobną klasę do obslugi sesji poprzez pliki (czy zmieniam handlera 2x - raz dla bazy, raz dla plików), ale nadal sesja plikowa się sypie jeśli "przed nią" użyję sesji bazodanowej - dublują się pliki, klasa (metodą destroy) próbuje usunąć nieistniejący plik, nie zapisują się dane czasami, nie odczytują nigdy itd.

robię to tak:

  1. /* Includowanie pliku, który z kolei includuje klasę-handlera (baza danych), i ustawia tę klasę.
  2.   Sesja automatycznie zostaje wystartowana poprzez plik includujący klasę-handlera, w sposób:
  3.   (fragment ilustrujący jak to wygląda):
  4.  
  5. session_set_save_handler // ustawianie
  6. session_name // sesja plikowa i bazodanowa mają inne nazwy
  7. session_start();
  8. session_regenerate_id(true);
  9.  
  10. */
  11. // "Zabawa" z sesją bazodanową.
  12. // session_write_close(); - to nie załatwia sprawy do końca :/
  13. /* Includowanie pliku, który z kolei includuje klasę-handlera (pliki), i ustawia tę klasę.
  14.   Sesja automatycznie zostaje wystartowana poprzez plik includujący klasę-handlera, w sposób:
  15.   (fragment ilustrujący jak to wygląda):
  16.  
  17. session_set_save_handler // ustawianie
  18. session_name // nazwa sesji plikowej
  19. session_start();
  20. session_regenerate_id(true);
  21.  
  22. */
  23. // "Zabawa" z sesją plikową.
  24.  
  25. // I tutaj sesja plikowa nie działa jak należy, natomiast jeśli wywalę wszystko co jest przed session_write_close(); włącznie to "gra gitara".


Nie wierzę, że nikt nie wie jak poradzić sobie z tym problemem...

Ten post edytował Walian 24.08.2009, 20:01:53
Go to the top of the page
+Quote Post
erix
post 24.08.2009, 20:34:10
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




  1. AFAIK, nie ma możliwości wywalenia zefiniowanego handlera
  2. lepiej się pomęcz w klasie i zrób to odpowiednio, bo nawet jeśli by się dało - byłoby to mniej wydajne


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
zegarek84
post 24.08.2009, 20:52:13
Post #5





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(Walian @ 24.08.2009, 21:00:41 ) *
Czyli Tobie chodzi o to, bym mojego handlera przerobił tak, by zapisywał/odczytywał dane zarówno z bazy danych jak i z plików, w zależności co wybiorę w danym momencie....

zrób klasę opakowującą całość będącą sterownikiem i przekazującą parametry w zależności od jej ustawień wewnętrznej zmiennej... jak zmienisz wartość tej zmiennej to przekierowanie na inną klasę/funkcję czy co tam jeszcze masz ;p


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Walian
post 25.08.2009, 20:18:53
Post #6





Grupa: Zarejestrowani
Postów: 124
Pomógł: 1
Dołączył: 13.07.2009

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


Dobra przerobiłem klasę, wydaje mi się, że działa dobrze, ale gdy nie zmieniam Session Id, tyle, że chcę je zmianiać - dla bezpieczeństwa.

Spójrzcie na poniższy skrypt:
  1. echo "Sesja 1:<br>\n";
  2. session_name('SESJA_1');
  3. echo 'SID after session_start(): '.session_id()."<br>\n";
  4. echo 'SID after session_regenerate_id(): '.session_id()."<br>\n";
  5. echo "<br><br>Sesja 2:<br>\n";
  6. session_name('SESJA_2');
  7. echo 'SID after session_start(): '.session_id()."<br>\n"; // <- tu powinno być nowe id, a jest stare!
  8. echo 'SID after session_regenerate_id(): '.session_id()."<br>\n";


Skrypt zwróci:
Kod
Sesja 1:
SID after session_start(): pqj5e9168f83j3v3f6rrr67iq3
SID after session_regenerate_id(): fhheis585jjerceguvq4n25vg6


Sesja 2:
SID after session_start(): fhheis585jjerceguvq4n25vg6
SID after session_regenerate_id(): g8plb8lmesj4nr89bj20g6ptc2


Wiem, że mogę to rozwiązać np. wrzucając:
  1. session_id(md5('jakis_losowy_ciag'));

przed:
  1. session_name('SESJA_2');

ale nie wiem czy to dobry pomysł...
Jak Wy byście to zrobili?

Ten post edytował Walian 25.08.2009, 20:20:56
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 19:39