Mam problem z przerobieniem klasy do zarzadzanie sesjami która współpracuje z bazą PostgreSQL na współprace z baza MySQL.
Przykład class-y pochdzi z książki "PHP5 zaawansowane programowanie" zamieszcze poniżej skrypty z ksiażki i jeżeli to możliwe to prosze o pomoc w przeróbce.
CREATE TABLE sesja uzytkownika ( "id" SERIAL PRIMARY KEY NOT NULL, "identyfikator_sesji_ascii" character varying(32), "zalogowany" bool, "identyfikator_uzytkownika" int4, "ostatnie_dzialanie" timestamp, "utworzono" timestamp, "user_agent" character varying(256) ); CREATE TABLE "uzytkownik" ( "id" SERIAL PRIMARY KEY NOT NULL, "nazwa_uzytkownika" character varying(32), "md5_haslo" character varying(32), "imie" character varying(64), "nazwisko" character varying(64) ); CREATE TABLE "zmienna_sesji" ( "id" SERIAL PRIMARY KEY NOT NULL, "identyfikator_sesji" int4, "nazwa_zmiennej" character varying(64), "wartosc_zmiennej" text ); INSERT INTO "uzytkownik"(nazwa_uzytkownika, md5_haslo, imie, nazwisko) VALUES ('edek', '827ccb0eea8a706c4c34a16891f84e7b', 'Edek', 'Tomaszkiewicz');
plik usersession.phpm
<?php class UserSession { private $php_session_id; private $native_session_id; private $dbhandle; private $logged_in; private $user_id; private $session_timeout = 600; # 10 minutowy maksymalny czas nieaktywności sesji private $session_lifespan = 3600; # 1 godzinny maksymalny czas trwania sesji. public function __construct() { # Łączy z bazą danych $this->dbhandle = pg_connect("host=db dbname=prophp5 user=edek") or die ("Błąd PostgreSQL: --> " . pg_last_error($this->dbhandle)); # Inicjalizuje mechanizm obsługi sesji ); # Sprawdza przesłane cookie o ile je przesłano; jeżeli wygląda podejrzanie zosta
ja z miejsca anulowane $strUserAgent = $GLOBALS["HTTP_USER_AGENT"]; if ($_COOKIE["PHPSESSID"]) { # Kontrola bezpieczeństwa i ważności $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 . " seconds') AND user_agent='" . $strUserAgent . "' AND ((now() - ostatnia_reakcja) <= '".$this->session_timeout." seconds' OR ostatnia_reakcja IS NULL)"; # Ustawia znacznik niepowodzenia $failed = 1; # Usuwa z bazy danych - w tym samym czasie usuwane są przeterminowane sesje $result = pg_query("DELETE FROM "sesja_uzytkownika" WHERE (identyfikator_sesji_ascii = '". $this->php_session_id . "') OR (now() - utworzono) > $maxlifetime)"); # Usuwa nieprzydatne zmienne sesji $result = pg_query("DELETE FROM "zmienna_sesji" WHERE identyfikator_sesji NOT IN (SELECT id FROM "sesja_użytkownika")"); # Pozbywa się identyfikatora, wymuszając na php nadanie nowego }; }; # Ustawia czas życia cookie # Wywołuje metodę session_start by zainicjować sesję } public function Impress() { if ($this->native_session_id) { $result = pg_query("UPDATE "sesja_uzytkownika" SET ostatnia_reakcja = now() WHERE id = " . $this->native_session_id); }; } public function IsLoggedIn() { return($this->logged_in); } public function GetUserID() { if ($this->logged_in) { return($this->user_id); } else { return(false); }; } public function GetUserObject() { if ($this->logged_in) { 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($strUsername, $strPlainPassword) { $stmt = "SELECT id FROM "uzytkownik" WHERE nazwa_uzytkownika = '$strUsername' AND md5_haslo = '$strMD5Password'"; $this->user_id = $row["id"]; $this->logged_in = true; $result = pg_query("UPDATE "sesja_uzytkownika" SET zalogowany = true, identyfikator_uzytkownika = " . $this->user_id . " WHERE id = " . $this->native_session_id); return(true); } else { return(false); }; } public function LogOut() { if ($this->logged_in == true) { $result = pg_query("UPDATE "sesja_uzytkownika" SET zalogowany = false, identyfikator_uzytkownika = 0 WHERE id = " . $this->native_session_id); $this->logged_in = false; $this->user_id = 0; return(true); } else { return(false); }; } public function __get($nm) { $result = pg_query("SELECT wartosc_zmiennej FROM zmienna_sesji WHERE identyfikator_sesji = " . $this->native_session_id . " AND nazwa_zmiennej = '" . $nm . "'"); } 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')"; } private function _session_open_method($save_path, $session_name) { # Do nothing return(true); } private function _session_close_method() { return(true); } private 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; # Na razie ustawia znacznik niepowodzenie na 1 $failed = 1; # Sprawdza czy sesja istnieje w bazie danych $result = pg_query("SELECT id, zalogowany, identyfikator_uzytkownika FROM "sesja_uzytkownika" WHERE identyfikator_sesji_ascii = '$id'"); $this->native_session_id = $row["id"]; if ($row["zalogowany"]=="t") { $this->logged_in = true; $this->user_id = $row["identyfikator_uzytkownika"]; } else { $this->logged_in = false; }; } else { $this->logged_in = false; # Konieczne jest stworzenie wpisu w bazie danych $result = pg_query("INSERT INTO sesja_uzytkownika(identyfikator_sesji_ascii, zalogowany, identyfikator_uzytkownika, utworzono
, user_agent) VALUES ('$id','f',0,now(),'$strUserAgent')"); # Teraz pobiera prawdziwy identyfikator $this->native_session_id = $row["id"]; }; # Zwraca jedynie ciąg pusty return(""); } private function _session_write_method($id, $sess_data) { return(true); } private function _session_destroy_method($id) { return($result); } private function _session_gc_method($maxlifetime) { return(true); } } ?>
oraz plik testujacy działanie class-y
przeprowadza on logowanie uzytkownika edek oraz jego wylogowanie
usersessiontest.php
<?php require_once("usersession.phpm"); $objSession = new UserSession(); $objSession->Impress(); ?> Strona testowa klasy UserSession <HR> <B>Bieżący identyfikator sesji: </B> <?=$objSession->GetSessionIdentifier();?><BR> <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == true) ? "Tak" : "Nie")?><BR> <BR><BR> Próba logowania ... <?php $objSession->Login("edek","12345"); ?> <BR><BR> <B>Użytkownik zalogowany? </B> <?=(($objSession->IsLoggedIn() == true) ? "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() == true) ? "Tak" : "Nie")?><BR> <BR><BR>