Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Session Handler - powrót do domyślnego
Forum PHP.pl > Forum > PHP
Walian
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?
erix
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
Walian
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...
erix
  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
zegarek84
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
Walian
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?
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.