Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require_once("databasehelper.php");
- class SessionException extends Exception
- {
- const UNKNOWN = 0;
- const DB_FAIL = 1;
- const NOT_FOUND = 2;
- public function __construct($message, $code = 0, Exception $previous = null)
- {
- parent::__construct($message, $code, $previous);
- }
- }
- class SessionWrapper
- {
- private static $global_session = null;
- public static function startGlobalSession()
- {
- if (SessionWrapper::$global_session == null)
- {
- SessionWrapper::$global_session = new SessionWrapper();
- }
- }
- function __construct()
- {
- $this->startSession();
- }
- function __destruct()
- {
- }
- public function startSession()
- {
- session_set_save_handler(
- array($this, 'open'),
- array($this, 'close'),
- array($this, 'read'),
- array($this, 'write'),
- array($this, 'destroy'),
- array($this, 'gc')
- );
- register_shutdown_function('session_write_close');
- session_start();
- }
- public function open($save_path, $session_name)
- {
- // currently nothing to do for open
- return TRUE;
- }
- public function close()
- {
- // currently nothing to do for close
- return TRUE;
- }
- public function read($session_id)
- {
- try
- {
- $dbh = DatabaseHelper::getInstance();
- $conn = $dbh->getConnection();
- $query = "SELECT us.session_data FROM user_session us WHERE us.session_id = :session_id";
- $pstmt = $conn->prepare($query);
- $pstmt->bindParam(":session_id", $session_id);
- if ($pstmt->execute() == TRUE)
- {
- if ($pstmt->rowCount() == 0)
- {
- $error_str = "Returned 0 rows. Session doesn't seem to exist.";
- throw new SessionException($error_str, SessionException::NOT_FOUND);
- }
- else if ($pstmt->rowCount() > 1)
- {
- $error_str = "Returned more than 1 row. Session ID should be unique.";
- throw new SessionException($error_str, SessionException::UNKNOWN);
- }
- $row = $pstmt->fetch(PDO::FETCH_ASSOC);
- if ($row === FALSE)
- {
- $error_arr = $pstmt->errorInfo();
- $error_str = "Could not fetch row. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::QUERY_FAIL);
- }
- $data = $row["session_data"];
- return $data;
- }
- else
- {
- $error_arr = $pstmt->errorInfo();
- $error_str = "Database query execution failed, but didn't throw exception. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL);
- }
- }
- catch (DatabaseException $e)
- {
- $error_str = "Database error. Exception received. "
- . "Message: " . $e->getMessage();
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- catch (PDOException $e)
- {
- $error_arr = $e->errorInfo;
- $error_str = "Database error. Exception received. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- return '';
- }
- public function write($session_id, $data)
- {
- try
- {
- $dbh = DatabaseHelper::getInstance();
- $conn = $dbh->getConnection();
- $exists = FALSE;
- $query = "SELECT us.session_data FROM user_session us WHERE us.session_id = :session_id";
- $pstmt = $conn->prepare($query);
- $pstmt->bindParam(":session_id", $session_id);
- if ($pstmt->execute() == TRUE)
- {
- if ($pstmt->rowCount() == 0)
- {
- $exists = FALSE;
- }
- else if ($pstmt->rowCount() > 1)
- {
- $error_str = "Returned more than 1 row. Session ID should be unique.";
- throw new SessionException($error_str, SessionException::UNKNOWN);
- }
- else
- {
- $exists = TRUE;
- }
- }
- else
- {
- $error_arr = $pstmt->errorInfo();
- $error_str = "Database query execution failed, but didn't throw exception. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL);
- }
- if ($exists == TRUE)
- {
- $query = "UPDATE user_session SET session_id=:session_id, last_request_time=:last_request_time, session_data=:session_data";
- }
- else
- {
- $query = "INSERT INTO user_session (session_id, last_request_time, session_data) "
- . "VALUES (:session_id, :last_request_time, :session_data)";
- }
- $last_request_time = time();
- $pstmt = $conn->prepare($query);
- $pstmt->bindParam(":session_id", $session_id);
- $pstmt->bindParam(":last_request_time", $last_request_time);
- $pstmt->bindParam(":session_data", $data);
- if ($pstmt->execute() == TRUE)
- {
- return TRUE;
- }
- else
- {
- $error_arr = $pstmt->errorInfo();
- $error_str = "Database query execution failed, but didn't throw exception. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL);
- }
- }
- catch (DatabaseException $e)
- {
- $error_str = "Database error. Exception received. "
- . "Message: " . $e->getMessage();
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- catch (PDOException $e)
- {
- $error_arr = $e->errorInfo;
- $error_str = "Database error. Exception received. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- return FALSE;
- }
- public function destroy($session_id)
- {
- try
- {
- $dbh = DatabaseHelper::getInstance();
- $conn = $dbh->getConnection();
- $query = "DELETE FROM user_session WHERE session_id=:session_id";
- $pstmt = $conn->prepare($query);
- $pstmt->bindParam(":session_id", $session_id);
- if ($pstmt->execute() == TRUE)
- {
- return TRUE;
- }
- else
- {
- $error_arr = $pstmt->errorInfo();
- $error_str = "Database query execution failed, but didn't throw exception. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL);
- }
- }
- catch (DatabaseException $e)
- {
- $error_str = "Database error. Exception received. "
- . "Message: " . $e->getMessage();
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- catch (PDOException $e)
- {
- $error_arr = $e->errorInfo;
- $error_str = "Database error. Exception received. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- return FALSE;
- }
- public function gc($lifetime)
- {
- try
- {
- $dbh = DatabaseHelper::getInstance();
- $conn = $dbh->getConnection();
- $old = time() - $lifetime;
- $query = "DELETE FROM user_session WHERE last_request_time < :old";
- $pstmt = $conn->prepare($query);
- $pstmt->bindParam(":old", $old);
- if ($pstmt->execute() == TRUE)
- {
- return TRUE;
- }
- else
- {
- $error_arr = $pstmt->errorInfo();
- $error_str = "Database query execution failed, but didn't throw exception. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL);
- }
- }
- catch (DatabaseException $e)
- {
- $error_str = "Database error. Exception received. "
- . "Message: " . $e->getMessage();
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- catch (PDOException $e)
- {
- $error_arr = $e->errorInfo;
- $error_str = "Database error. Exception received. "
- . "SQLSTATE code: " . $error_arr[0]
- . ", Driver code: " . $error_arr[1]
- . ", Message: " . $error_arr[2];
- throw new SessionException($error_str, SessionException::DB_FAIL, $e);
- }
- return FALSE;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement