Przerobiłem ją trochę dla moich potrzeb i pewnie w tym cały sęk:
Nie działa wprowadzanie zmiennych sesji do bazy danych poprzez funkcje __set i wyciaganie tych zmiennych poprzez funkcję __get. Nie za bardzo rozumiem dlaczego to nie działa. Następnym problemem są prawa do funkcji :
Przy ustawieniu ich na private wywala błędy przy testowaniu :
_session_write_method
_session_open_method
_session_read_method
itd.
Będę bardzo wdzięczny za każdą podpowiedź a poniżej zamieszczam kod klasy i kod testujący.
<?php //require_once("class.Database.phpm"); class user_session { private $php_session_id; private $native_session_id; private $dbhandle; private $logged_in; private $user_id; private $session_timeout = 600; //10 minutowy max czas nieaktywności private $session_lifespan = 3600; //1 godzinny max czas ważności sesji public function __construct() { ##połączenie z bazą danych //$this->dbhandle = new Database(); //sprawdzamy czy przesłane cookie jest ok i jesli nie to niszczymy sesję if ($_COOKIE["PHPSESSID"]) { $this->php_session_id = $_COOKIE["PHPSESSID"]; $stmt = "select id from sesja_uzytkownika where identyfikator_sesji_ascii = '".$this->php_session_id."' and ((now() - utworzono) < '" .$this->session_lifespan."' ) and ((now() - ostatnia_reakcja) <= '" .$this->session_timeout."' or ostatnia_reakcja is null )"; #ustawia znacznik niepowodzenia na 1 $failed = 1; #usuwa z bazy danych przeterminowane sesje $result = "DELETE FROM "sesja_uzytkownika" WHERE (identyfikator_sesji_ascii = '". $this->php_session_id . "') OR (now() - utworzono) > $maxlifetime)"; //$delete = "delete from sesja_uzytkownika where (identyfikator_sesji_ascii = ".$this->php_session_id." or ((now() - utworzono) //> ".$this->session_lifespan." ) or ((now() - ostatnia_reakcja) > ".$this->session_timeout." ))"; $delete = "delete from zmienna_sesji where identyfikator_sesji not in ( select id from sesja_uzytkownika )"; #wymusza nadanie nowego idetyfiaktora sesji } } #ustawia czas życia cookie #wywołauje metode session_start aby zainicjować sesję } public function Impress() { if ($this->native_session_id) { try { $result = mysql_query("update sesja_uzytkownika set ostatnia_reakcja = now() where id = ".$this->native_session_id); } catch (Exception $e) { } } } public function IsLoggedIn() { return ($this->logged_in); } public function GetUserId() { if ($this->logged_in == 1) { return ($this->user_id); } else { return (false); } } public function GetUserObject() { if ($this->logged_in == 1) { if (class_exists("user")) { $objUser = new user($this->user_id); return($objUser); } else { return(false); } } } public function GetSessionIdentifier() { return($this->php_session_id); } public function Login($str_username, $str_plain_password) { $strMD5Password = $str_plain_password; $stmt = "select id from uzytkownik where login = "".$str_username."" and haslo = "".$strMD5Password."""; $this->user_id = $row["id"]; $this->logged_in = 1; $result = mysql_query("update sesja_uzytkownika set zalogowany = 1 , identyfikator_uzytkownika = " . $this->user_id . " where id = " . $this->native_session_id); return(true); } else { return(false); } } public function LogOut() { if ($this->logged_in == 1) { try { $result = mysql_query("update sesja_uzytkownika set zalogowany = 0, identyfikator_uzytkownika = 0
where id = " . $this->native_session_id); } catch (Exception $e) { } $this->logged_in = 0; $this->user_id = 0; return(true); } else { return(false); } } public function __get($nm) { try { $result = mysql_query("select wartosc_zmiennej from zmienna_sesji where identyfikator_sesji = " . $this->native_session_id . " and nazwa_zmiennej = '" . $nm . "'"); } catch (Exception $e) { } } else { return(false); } } public function __set($nm, $val) { $stmt = "INSERT INTO zmienna_sesji(identyfikator_sesji, nazwa_zmiennej, wartosc_zmiennej) VALUES('" . $this->native_session_id . "', '$nm', '$strSer')"; try { } catch (Exception $e) { } } public function _session_open_method($save_path, $session_name) { # Do nothing return(true); } public function _session_close_method() { return(true); } public function _session_read_method($id) { # Służy do ustalenia, czy nasza sesja w ogóle istnieje $strUserAgent = $GLOBALS["HTTP_USER_AGENT"]; $this->php_session_id = $id; //$id = $this->php_session_id; # Na razie ustawia znacznik niepowodzenie na 1 $failed = 1; # Sprawdza czy sesja istnieje w bazie danych $stmt = "SELECT id, zalogowany, identyfikator_uzytkownika FROM sesja_uzytkownika WHE
RE identyfikator_sesji_ascii = '$id'"; try { } catch (Exception $e) { } $this->native_session_id = $row["id"]; if ($row["zalogowany"]==1) { $this->logged_in = 1; $this->user_id = $row["identyfikator_uzytkownika"]; } else { $this->logged_in = 0; }; } else { $this->logged_in = 0; # Konieczne jest stworzenie wpisu w bazie danych try { $result = mysql_query("INSERT INTO sesja_uzytkownika(identyfikator_sesji_ascii, zalogowany, identyfikator_uzytkownika, utworzono
, user_agent) VALUES ('$id','0',0,now(),'$strUserAgent')"); } catch (Exception $e) { } # Teraz pobiera prawdziwy identyfikator try { $result = mysql_query("SELECT id from sesja_uzytkownika WHERE identyfikator_sesji_ascii = '$this->php_session_id'"); } catch (Exception $e) { } $this->native_session_id = $row["id"]; }; # Zwraca jedynie ciąg pusty return(""); } public function _session_write_method($id, $sess_data) { return(true); } public function _session_destroy_method($id) { try { } catch (Exception $e) { } return($result); } public function _session_gc_method($maxlifetime) { return(true); } } ?>
kod testujacy klasę
<?php require_once("user_session.phpm"); $objSession = new user_session(); $objSession->Impress(); ?> Strona testowa klasy UserSession <HR> <B>Bieżący identyfikator sesji: </B> <?=$objSession->GetSessionIdentifier();?><BR> <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == 1) ? "Tak" : "Nie")?><BR> <BR><BR> Próba logowania ... <?php $objSession->Login("edek","12345"); ?> <BR><BR> <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == 1) ? "Tak" : "Nie")?><BR> <B>Identyfikator zalogowanego użytkownika: </B> <?=$objSession->GetUserId();?><BR> <BR><BR> Wylogowywanie... <?php $objSession->LogOut(); ?> <BR><BR> <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == 1) ? "Tak" : "Nie")?><BR> <BR><BR>
Na koniec dodam jeszcze jeden problem to nie usuwa przestarzałych sesji z bazy.