Witam mam problem z klasą z książki PHP5 zaawansowane programowanie. Napisze o co mi chodzi:
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();
array(&$this, '_session_open_method'), array(&$this, '_session_close_method'), array(&$this, '_session_read_method'), array(&$this, '_session_write_method'), array(&$this, '_session_destroy_method'), array(&$this, '_session_gc_method'));
//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
unset($_COOKIE["PHPSESSID"]); }
}
#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) {
echo $e; //trzeba utworzyć obiekt klasy wyjątek }
}
}
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 {
$result = mysql_query("DELETE FROM sesja_uzytkownika WHERE identyfikator_sesji_ascii = '$id'"); }
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.