mam problem z poniższą klasą. Objawia się on tym, że przy każdym odświeżeniu strony klasa tworzy nową sesję (nowy rekord w bazie, nowe id) zamiast korzystać z tego, co wygenerowała kilka sekund temu. Byłbym bardzo wdzięczny o pomoc. Jeśli chodzi o bazę danych to łączy się dobrze, nie ma z tym problemów. Sęk w tym, że nie wiem, gdzie problem jest.
Kod klasy:
class usersession { private $php_session_id; private $native_session_id; private $logged_in; private $user_id; private $dbhandle; private $session_timeout = 1800; private $session_lifespan = 7200; public function __construct($dbhandle) { ); $this->dbhandle = $dbhandle; $this->php_session_id = $_COOKIE['PHPSESSID']; $strUserAgent = $_SERVER['HTTP_USER_AGENT']; $stmt = "SELECT session_id FROM {prefix}sessions WHERE session_ascii_id = '" . $this->php_session_id . "' AND ((".time()." - session_create_time) < '" . $this->session_lifespan . "') AND session_user_agent='" . $strUserAgent . "' AND ((".time()." - session_last_action_time) <= '" . $this->session_timeout . "' OR session_last_action_time IS NULL)"; $result = $dbhandle->_query($stmt); if ($dbhandle->_num_rows($result)==0) { $result = $dbhandle->_query("DELETE FROM {prefix}sessions WHERE (session_ascii_id = '". $this->php_session_id . "') OR (".time()." - session_create_time) > ". $this->session_lifespan . ")"); $result = $dbhandle->_query("DELETE FROM {prefix}sessions_variables WHERE variable_session_id NOT IN (SELECT session_id FROM {prefix}sessions)"); } } } public function Impress() { if ($this->native_session_id) { $result = $dbhandle->_query("UPDATE {prefix}sessions SET session_last_action_time = ".time()." WHERE session_id = " . $this->native_session_id); } } public function getSessionId() { return $this->php_session_id; } public function open($savePath, $sessionName) { return true; } public function close() { return true; } public function read($id) { $strUserAgent = $_SERVER['HTTP_USER_AGENT']; $this->php_session_id = $id; $failed = 1; $result = $this->dbhandle->_query("SELECT session_id, session_login_status, session_user_id FROM {prefix}sessions WHERE session_ascii_id = '$id'"); if ($this->dbhandle->_num_rows($result)>0) { $row = $this->dbhandle->_fetch_array($result); $this->native_session_id = $row['session_id']; if ($row['session_login_status']=='1') { $this->logged_in = true; $this->user_id = $row['session_user_id']; } else { $this->logged_in = false; } } else { $this->logged_in = false; $this->dbhandle->_query("INSERT INTO {prefix}sessions(session_ascii_id, session_login_status, session_user_id, session_create_time, session_user_agent) VALUES ('$id','f',0,".time().",'$strUserAgent')"); $result = $this->dbhandle->_query("SELECT session_id FROM {prefix}sessions WHERE session_ascii_id = '$id'"); $row = $this->dbhandle->_fetch_array($result); $this->native_session_id = $row['session_id']; } return(""); } public function write($id, $data) { } public function destroy($id) { $result = $dbhandle->_query("DELETE FROM {prefix}sessions WHERE session_ascii_id = '$id'"); return($result); } public function gc($maxlifetime) { $result = $dbhandle->_query("DELETE FROM {prefix}sessions WHERE ".time()." - session_create_time) > ". $maxlifetime); $result = $dbhandle->_query("DELETE FROM {prefix}sessions_variables WHERE variable_session_id NOT IN (SELECT session_id FROM {prefix}sessions)"); return true; } public function __get($nm) { $result = $this->dbhandle->_query("SELECT variable_content FROM {prefix}sessions_variables WHERE variable_session_id = " . $this->native_session_id . " AND variable_name = '" . $nm . "'"); if ($this->dbhandle->_num_rows($result)>0) { $row = $this->dbhandle->_fetch_array($result); } else { return(false); }; } public function __set($nm, $val) { $this->dbhandle->_query("DELETE FROM {prefix}sessions_variables WHERE variable_session_id='".$this->native_session_id."' AND variable_name='".$nm."'"); $stmt = "INSERT INTO {prefix}sessions_variables(variable_session_id, variable_name, variable_content) VALUES(" . $this->native_session_id . ", '$nm', '$strSer')"; $result = $this->dbhandle->_query($stmt); return($result); } public function Login($strUsername, $strPlainPassword) { $stmt = "SELECT user_id FROM {prefix}users WHERE user_name='" . $strUsername . "' AND user_password='" . $strMD5Password . "'"; $result = $this->dbhandle->_query($stmt); if ($this->dbhandle->_num_rows($result)>0) { $row = $this->dbhandle->_fetch_array($result); $this->user_id = $row['user_id']; $this->logged_in = true; $result = $dbhandle->_query("UPDATE {prefix}sessions SET session_login_status = true, session_user_id = " . $this->user_id . " WHERE user_id = " . $this->native_session_id); return(true); } else { return(false); }; } public function LogOut() { if ($this->logged_in == true) { $result = $this->dbhandle->_query("UPDATE {prefix}sessions SET session_login_status = false, session_user_id = 0 WHERE user_id = " . $this->native_session_id); $this->logged_in = false; $this->user_id = 0; return(true); } else { return(false); }; } public function IsLoggedIn() { return($this->logged_in); } }
Chodzi prawdopodobnie o metodę read, ale nie za bardzo odnajduję tam błąd.