Advertisement
Guest User

sessionwrapper.php

a guest
Oct 29th, 2012
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.43 KB | None | 0 0
  1. require_once("databasehelper.php");
  2.  
  3. class SessionException extends Exception
  4. {
  5.     const UNKNOWN = 0;
  6.     const DB_FAIL = 1;
  7.     const NOT_FOUND = 2;
  8.    
  9.     public function __construct($message, $code = 0, Exception $previous = null)
  10.     {
  11.         parent::__construct($message, $code, $previous);
  12.     }
  13. }
  14.  
  15. class SessionWrapper
  16. {
  17.     private static $global_session = null;
  18.    
  19.     public static function startGlobalSession()
  20.     {
  21.         if (SessionWrapper::$global_session == null)
  22.         {
  23.             SessionWrapper::$global_session = new SessionWrapper();
  24.         }
  25.     }
  26.    
  27.     function __construct()
  28.     {
  29.         $this->startSession();
  30.     }
  31.    
  32.     function __destruct()
  33.     {
  34.    
  35.     }
  36.    
  37.     public function startSession()
  38.     {
  39.         session_set_save_handler(
  40.             array($this, 'open'),
  41.             array($this, 'close'),
  42.             array($this, 'read'),
  43.             array($this, 'write'),
  44.             array($this, 'destroy'),
  45.             array($this, 'gc')
  46.             );
  47.            
  48.         register_shutdown_function('session_write_close');
  49.        
  50.         session_start();
  51.     }
  52.    
  53.     public function open($save_path, $session_name)
  54.     {
  55.         // currently nothing to do for open
  56.         return TRUE;
  57.     }
  58.    
  59.     public function close()
  60.     {
  61.         // currently nothing to do for close
  62.         return TRUE;
  63.     }
  64.    
  65.     public function read($session_id)
  66.     {      
  67.         try
  68.         {
  69.             $dbh = DatabaseHelper::getInstance();
  70.             $conn = $dbh->getConnection();
  71.        
  72.             $query = "SELECT us.session_data FROM user_session us WHERE us.session_id = :session_id";      
  73.            
  74.             $pstmt = $conn->prepare($query);
  75.             $pstmt->bindParam(":session_id", $session_id);
  76.  
  77.             if ($pstmt->execute() == TRUE)
  78.             {  
  79.                 if ($pstmt->rowCount() == 0)
  80.                 {
  81.                     $error_str = "Returned 0 rows. Session doesn't seem to exist.";
  82.                    
  83.                     throw new SessionException($error_str, SessionException::NOT_FOUND);
  84.                 }
  85.                
  86.                 else if ($pstmt->rowCount() > 1)
  87.                 {
  88.                     $error_str = "Returned more than 1 row. Session ID should be unique.";
  89.                    
  90.                     throw new SessionException($error_str, SessionException::UNKNOWN);
  91.                 }
  92.                
  93.                 $row = $pstmt->fetch(PDO::FETCH_ASSOC);
  94.                
  95.                 if ($row === FALSE)
  96.                 {
  97.                     $error_arr = $pstmt->errorInfo();
  98.                     $error_str = "Could not fetch row. "
  99.                         . "SQLSTATE code: " . $error_arr[0]
  100.                         . ", Driver code: " . $error_arr[1]
  101.                         . ", Message: " . $error_arr[2];
  102.                        
  103.                     throw new SessionException($error_str, SessionException::QUERY_FAIL);
  104.                 }
  105.                
  106.                 $data = $row["session_data"];
  107.                
  108.                 return $data;
  109.             }
  110.            
  111.             else
  112.             {
  113.                 $error_arr = $pstmt->errorInfo();
  114.                 $error_str = "Database query execution failed, but didn't throw exception. "
  115.                     . "SQLSTATE code: " . $error_arr[0]
  116.                     . ", Driver code: " . $error_arr[1]
  117.                     . ", Message: " . $error_arr[2];
  118.                    
  119.                 throw new SessionException($error_str, SessionException::DB_FAIL);
  120.             }
  121.         }
  122.         catch (DatabaseException $e)
  123.         {
  124.             $error_str = "Database error. Exception received. "
  125.                 . "Message: " . $e->getMessage();
  126.                
  127.             throw new SessionException($error_str, SessionException::DB_FAIL, $e);     
  128.         }
  129.         catch (PDOException $e)
  130.         {
  131.             $error_arr = $e->errorInfo;
  132.             $error_str = "Database error. Exception received. "
  133.                 . "SQLSTATE code: " . $error_arr[0]
  134.                 . ", Driver code: " . $error_arr[1]
  135.                 . ", Message: " . $error_arr[2];
  136.                
  137.             throw new SessionException($error_str, SessionException::DB_FAIL, $e);
  138.         }
  139.        
  140.         return '';
  141.     }
  142.    
  143.     public function write($session_id, $data)
  144.     {
  145.         try
  146.         {
  147.             $dbh = DatabaseHelper::getInstance();
  148.             $conn = $dbh->getConnection();
  149.            
  150.             $exists = FALSE;
  151.            
  152.             $query = "SELECT us.session_data FROM user_session us WHERE us.session_id = :session_id";      
  153.            
  154.             $pstmt = $conn->prepare($query);
  155.             $pstmt->bindParam(":session_id", $session_id);
  156.            
  157.             if ($pstmt->execute() == TRUE)
  158.             {
  159.                 if ($pstmt->rowCount() == 0)
  160.                 {
  161.                     $exists = FALSE;
  162.                 }
  163.                
  164.                 else if ($pstmt->rowCount() > 1)
  165.                 {
  166.                     $error_str = "Returned more than 1 row. Session ID should be unique.";
  167.                    
  168.                     throw new SessionException($error_str, SessionException::UNKNOWN);
  169.                 }
  170.                
  171.                 else
  172.                 {
  173.                     $exists = TRUE;
  174.                 }
  175.             }
  176.             else
  177.             {
  178.                 $error_arr = $pstmt->errorInfo();
  179.                 $error_str = "Database query execution failed, but didn't throw exception. "
  180.                     . "SQLSTATE code: " . $error_arr[0]
  181.                     . ", Driver code: " . $error_arr[1]
  182.                     . ", Message: " . $error_arr[2];
  183.                    
  184.                 throw new SessionException($error_str, SessionException::DB_FAIL); 
  185.             }          
  186.                            
  187.             if ($exists == TRUE)
  188.             {
  189.                 $query = "UPDATE user_session SET session_id=:session_id, last_request_time=:last_request_time, session_data=:session_data";
  190.             }
  191.             else
  192.             {
  193.                 $query = "INSERT INTO user_session (session_id, last_request_time, session_data) "
  194.                     . "VALUES (:session_id, :last_request_time, :session_data)";
  195.             }
  196.            
  197.             $last_request_time = time();
  198.                
  199.             $pstmt = $conn->prepare($query);
  200.             $pstmt->bindParam(":session_id", $session_id);
  201.             $pstmt->bindParam(":last_request_time", $last_request_time);
  202.             $pstmt->bindParam(":session_data", $data);
  203.            
  204.             if ($pstmt->execute() == TRUE)
  205.             {
  206.                 return TRUE;
  207.             }
  208.             else
  209.             {
  210.                 $error_arr = $pstmt->errorInfo();
  211.                 $error_str = "Database query execution failed, but didn't throw exception. "
  212.                     . "SQLSTATE code: " . $error_arr[0]
  213.                     . ", Driver code: " . $error_arr[1]
  214.                     . ", Message: " . $error_arr[2];
  215.                    
  216.                 throw new SessionException($error_str, SessionException::DB_FAIL); 
  217.             }
  218.         }
  219.         catch (DatabaseException $e)
  220.         {
  221.             $error_str = "Database error. Exception received. "
  222.                 . "Message: " . $e->getMessage();
  223.                
  224.             throw new SessionException($error_str, SessionException::DB_FAIL, $e);     
  225.         }
  226.         catch (PDOException $e)
  227.         {
  228.             $error_arr = $e->errorInfo;
  229.             $error_str = "Database error. Exception received. "
  230.                 . "SQLSTATE code: " . $error_arr[0]
  231.                 . ", Driver code: " . $error_arr[1]
  232.                 . ", Message: " . $error_arr[2];
  233.                
  234.             throw new SessionException($error_str, SessionException::DB_FAIL, $e); 
  235.         }  
  236.  
  237.         return FALSE;
  238.     }
  239.    
  240.     public function destroy($session_id)
  241.     {
  242.         try
  243.         {
  244.             $dbh = DatabaseHelper::getInstance();
  245.             $conn = $dbh->getConnection();     
  246.                            
  247.             $query = "DELETE FROM user_session WHERE session_id=:session_id";
  248.                
  249.             $pstmt = $conn->prepare($query);
  250.             $pstmt->bindParam(":session_id", $session_id);
  251.            
  252.             if ($pstmt->execute() == TRUE)
  253.             {
  254.                 return TRUE;
  255.             }
  256.             else
  257.             {
  258.                 $error_arr = $pstmt->errorInfo();
  259.                 $error_str = "Database query execution failed, but didn't throw exception. "
  260.                     . "SQLSTATE code: " . $error_arr[0]
  261.                     . ", Driver code: " . $error_arr[1]
  262.                     . ", Message: " . $error_arr[2];
  263.                    
  264.                 throw new SessionException($error_str, SessionException::DB_FAIL); 
  265.             }
  266.         }
  267.         catch (DatabaseException $e)
  268.         {
  269.             $error_str = "Database error. Exception received. "
  270.                 . "Message: " . $e->getMessage();
  271.                
  272.             throw new SessionException($error_str, SessionException::DB_FAIL, $e);     
  273.         }
  274.         catch (PDOException $e)
  275.         {
  276.             $error_arr = $e->errorInfo;
  277.             $error_str = "Database error. Exception received. "
  278.                 . "SQLSTATE code: " . $error_arr[0]
  279.                 . ", Driver code: " . $error_arr[1]
  280.                 . ", Message: " . $error_arr[2];
  281.                
  282.             throw new SessionException($error_str, SessionException::DB_FAIL, $e); 
  283.         }
  284.  
  285.         return FALSE;
  286.     }
  287.    
  288.     public function gc($lifetime)
  289.     {
  290.         try
  291.         {
  292.             $dbh = DatabaseHelper::getInstance();
  293.             $conn = $dbh->getConnection(); 
  294.  
  295.             $old = time() - $lifetime;
  296.                            
  297.             $query = "DELETE FROM user_session WHERE last_request_time < :old";
  298.                
  299.             $pstmt = $conn->prepare($query);
  300.             $pstmt->bindParam(":old", $old);
  301.            
  302.             if ($pstmt->execute() == TRUE)
  303.             {
  304.                 return TRUE;
  305.             }
  306.             else
  307.             {
  308.                 $error_arr = $pstmt->errorInfo();
  309.                 $error_str = "Database query execution failed, but didn't throw exception. "
  310.                     . "SQLSTATE code: " . $error_arr[0]
  311.                     . ", Driver code: " . $error_arr[1]
  312.                     . ", Message: " . $error_arr[2];
  313.                    
  314.                 throw new SessionException($error_str, SessionException::DB_FAIL); 
  315.             }
  316.         }
  317.         catch (DatabaseException $e)
  318.         {
  319.             $error_str = "Database error. Exception received. "
  320.                 . "Message: " . $e->getMessage();
  321.                
  322.             throw new SessionException($error_str, SessionException::DB_FAIL, $e);     
  323.         }
  324.         catch (PDOException $e)
  325.         {
  326.             $error_arr = $e->errorInfo;
  327.             $error_str = "Database error. Exception received. "
  328.                 . "SQLSTATE code: " . $error_arr[0]
  329.                 . ", Driver code: " . $error_arr[1]
  330.                 . ", Message: " . $error_arr[2];
  331.                
  332.             throw new SessionException($error_str, SessionException::DB_FAIL, $e); 
  333.         }
  334.  
  335.         return FALSE;
  336.     }
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement