Witam!
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
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') );
# 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
unset($_COOKIE["PHPSESSID"]); };
};
# 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) {
$strMD5Password = md5($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
$result = pg_query("SELECT id from "sesja_uzytkownika
" WHERE identyfikator_sesji_ascii = '$id'"); $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) {
$result = pg_query("DELETE FROM "sesja_uzytkownika
" WHERE identyfikator_sesji_ascii = '$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>