![]() |
![]() |
-gosc- |
![]()
Post
#1
|
Goście ![]() |
Witam,
Napisałem swojego Session Handlera, wszystko działa, tylko jest mały szczegół. PHP nie generuje mi zawsze 32-znakowego identyfikatora sesji, tylko krótszy, np. 26-znakowy, 28-znakowy - różnie, jednak za każdym razem inaczej. Czy PHP powinien domyślnie generować tylko 32-znakowe identyfikatory, czy założenie twórców języka jest, że ma to być ciąg do 32 znaków? A może mam coś żle ustawione w php.ini? Druga sprawa, to problem wykorzystanie Uchwytu Sesji w pewnym fragmencie kodu. Otóż mam klasę odpowiedzialną za generowania 5-znakowych stringów i wstawianie ich do pliku graficznego, czyli pospolity token. Problem rozwiązuje w ten sposób, że utworzyłem plik token.php, a w nim instancję klasy Token wraz z metodą wyświetlająca obrazek. Do tego pliku odwołuję się w pliku register.tpl (używam systemu szablonów Smarty) i po prostu wstawiam do niego odwołanie w znacznikach <img>. Obrazek wyświetla się poprawnie. Mój problem polega jednak na tym, że w pliku token.class.php nie mogę powtórnie (bo pierwszy raz jest to zrobione register.php) uruchomić sesji przez klasę do obsługi sesji. Wtedy dostaję informację, że albo obrazek zawiera błędy, albo nie jest on generowany. Muszę jednak zrobić jakoś wywołać sesję bo nie widzę innego sposobu, aby zachować wygenerowany string tokenowy pomiędzy odświeżeniami. Jak rozwiązać ten problem? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 63 Pomógł: 10 Dołączył: 16.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Właściwie błędów jako takich nie ma, tylko w przypadku powtórnego użycia obiektu obrazek się nie generuje (wyświetla się sam tekst z tagu "alt"). Daję zatem klasę Session (dzielę wpis na 2 cześci bo w jednym się nie zmieści):
Kod require_once ('class/MySQL.class.php'); require_once ('class/Browser.class.php'); require_once ('class/CountSQL.class.php'); class Session { private $objSql; private $objBrowser; private $session_name = 'sid'; private $session_id; private $native_session_id; private $db_prefix; private $ip; private $browser_name; private $session_lifespan = 3600; private $session_timeout = 600; private $session_value; private $timestamp; private $zero = 0; private $null_session_varible = ''; public function __construct() { $this->objSql = MySQL::connect(); $this->objBrowser = new Browser(); $this->db_prefix = MySQL::$db_prefix; $this->browser_name = $this->objBrowser->GetBrowserName(); $this->ip = $_SERVER["REMOTE_ADDR"]; $this->timestamp = time(); session_set_save_handler( array(&$this, 'session_open'), array(&$this, 'session_close'), array(&$this, 'session_read'), array(&$this, 'session_write'), array(&$this, 'session_destroy'), array(&$this, 'session_gc') ); if(isset($_COOKIE[$this->session_name])) { $this->session_id = $_COOKIE[$this->session_name]; $stmt = $this->objSql->stmt_init(); $stmt->prepare("SELECT * FROM ".$this->db_prefix."sessions WHERE sessions_identifer =? AND sessions_useragent =? AND sessions_ip =? AND (sessions_start + ?) > UNIX_TIMESTAMP() AND ( sessions_last_time + ?) > UNIX_TIMESTAMP()"); $stmt->bind_param("sssii", $this->session_id, $this->browser_name, $this->ip, $this->session_lifespan, $this->session_timeout); $stmt->execute(); CountSQL::AddSQL(); $stmt->store_result(); $rows = $stmt->num_rows; if($rows==0) { if($this->ValidateSessionId()) { $bool = setcookie($this->session_name, $this->session_id, time() -3600); unset($_COOKIE[$this->session_name]); } $this->DeleteOldSessions(); } else { $this->Impress(); } } session_set_cookie_params($session_lifespan=0); session_start(); } public function session_open($session_savepath, $session_name) { return(true); } public function session_close() { $this->session_gc(); $this->objSql->close(); return(true); } public function session_read($session_id) { if(isset($_COOKIE[$this->session_name])) { $stmt = $this->objSql->stmt_init(); $stmt->prepare("INSERT INTO ".$this->db_prefix."sessions VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->bind_param("issiissi", $this->zero, $this->session_id, $this->null_session_varible, $this->timestamp, $this->timestamp, $this->ip, $this->browser_name, $this->zero); $stmt->execute(); CountSQL::AddSQL(); $sql = "SELECT sessions_varible FROM ".$this->db_prefix."sessions WHERE sessions_identifer = '$this->session_id'"; $query = $this->objSql->query($sql); CountSQL::AddSQL(); while($value = $query->fetch_assoc()) { $return = $value['sessions_varible']; } return $return; } } public function session_write($session_id, $session_value) { if(isset($_COOKIE[$this->session_name])) { $stmt = $this->objSql->stmt_init(); $stmt->prepare("UPDATE ".$this->db_prefix."sessions SET sessions_varible =? WHERE sessions_identifer =?"); $stmt->bind_param("ss", $session_value, $session_id); $stmt->execute(); CountSQL::AddSQL(); return(true); } } [cdn :-)] Kod public function session_destroy($session_id)
{ $stmt = $this->objSql->stmt_init(); $stmt->prepare("DELETE FROM ".$this->db_prefix."sessions WHERE sessions_identifer =?"); $stmt->bind_param("s", $session_id); $stmt->execute(); CountSQL::AddSQL(); return(true); } public function session_gc() { $stmt = $this->objSql->stmt_init(); $stmt->prepare("DELETE FROM ".$this->db_prefix."sessions WHERE (sessions_last_time + ?) < UNIX_TIMESTAMP()"); $stmt->bind_param("s", $this->session_timeout); $stmt->execute(); CountSQL::AddSQL(); return(true); } private function ValidateSessionId() { if(!ereg("[a-z0-9]{32}", $this->session_id)) return(true); } private function Impress() { $stmt = $this->objSql->stmt_init(); $stmt->prepare("UPDATE ".$this->db_prefix."sessions SET sessions_last_time = UNIX_TIMESTAMP() WHERE sessions_identifer =? AND sessions_ip =? AND sessions_useragent =?"); $stmt->bind_param("sss", $this->session_id, $this->ip, $this->browser_name); $stmt->execute(); CountSQL::AddSQL(); } private function DeleteOldSessions() { $stmt = $this->objSql->stmt_init(); $stmt->prepare("DELETE FROM ".$this->db_prefix."sessions WHERE sessions_identifer =? OR (sessions_start + ?) < UNIX_TIMESTAMP()"); $stmt->bind_param("si", $this->session_id, $this->session_lifespan); $stmt->execute(); CountSQL::AddSQL(); } } ?> Ten post edytował m44 18.11.2008, 17:05:11 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.10.2025 - 02:44 |