source: trunk/lib/DBSessionHandler.inc.php @ 1

Last change on this file since 1 was 1, checked in by scdev, 19 years ago

Initial import.

File size: 6.0 KB
Line 
1<?php
2/**
3 * DBSessionHandler.inc.php
4 * Code by Strangecode :: www.strangecode.com :: This document contains copyrighted information.
5 * @author  Quinn Comendant <quinn@strangecode.com>
6 * @version 1.3
7 * @since   1999
8 */
9
10class DBSessionHandler {
11   
12    var $db; // DB object.
13
14    var $_params = array(
15        'db_server' => 'localhost',
16        'db_name' => '',
17        'db_user' => '',
18        'db_pass' => '',
19        'db_table' => 'session_tbl',
20        'create_table' => true, // Automatically create table and verify columns. Better set to false after site launch.
21    );
22   
23    /**
24     * Constructor
25     *
26     * @access  public
27     * @param   
28     * @return 
29     * @author  Quinn Comendant <quinn@strangecode.com>
30     * @since   18 Jul 2005 11:02:50
31     */
32    function DBSessionHandler($db=null, $params=array())
33    {
34        $this->_params = array_merge($this->_params, $params);
35       
36        if (isset($db) && is_a($db, 'DB') && $db->isConnected()) {
37            // Use existing db connection.
38            $this->db =& $db;
39           
40        } else if (isset($db)) {
41            // Not a DB object.
42            App::logMsg(sprintf('Argument one is not a valid DB object: %s', gettype($db)), LOG_ERR, __FILE__, __LINE__);
43           
44        } else {
45            // Create our own new db connection.
46            require_once dirname(__FILE__) . '/DB.inc.php';
47           
48            $this->db =& new DB();
49            $this->db->setParam(array(
50                'db_server' => $this->_params['db_server'],
51                'db_name' => $this->_params['db_name'],
52                'db_user' => $this->_params['db_user'],
53                'db_pass' => $this->_params['db_pass'],
54                'db_always_debug' => $this->_params['db_always_debug'],
55                'db_debug' => $this->_params['db_debug'],
56                'db_die_on_failure' => $this->_params['db_die_on_failure'],
57            ));
58           
59            // Connect to database.
60            $this->db->connect();
61           
62        }
63
64        if (!is_a($this->db, 'DB') || !$this->db->isConnected()) {
65            trigger_error('Invalid DB object or unable to connect to database.', E_USER_ERROR);
66        }
67       
68        // Get create tables config from global context.
69        if (!is_null(App::getParam('db_create_tables'))) {
70            $this->_params['create_table'] = App::getParam('db_create_tables');
71        }
72       
73        // Ensure db table is fit.
74        $this->initDB();
75       
76        ini_set('session.save_handler', 'user');
77        session_set_save_handler(
78            array(&$this, 'dbSessionOpen'),
79            array(&$this, 'dbSessionClose'),
80            array(&$this, 'dbSessionRead'),
81            array(&$this, 'dbSessionWrite'),
82            array(&$this, 'dbSessionDestroy'),
83            array(&$this, 'dbSessionGarbage')
84        );
85    }
86
87    /**
88     * Setup the database table for this class.
89     *
90     * @access  public
91     * @author  Quinn Comendant <quinn@strangecode.com>
92     * @since   26 Aug 2005 17:09:36
93     */
94    function initDB($recreate_db=false)
95    {
96        static $_db_tested = false;
97   
98        if ($recreate_db || !$_db_tested && $this->_params['create_table']) {
99            if ($recreate_db) {
100                $this->db->query("DROP TABLE IF EXISTS " . $this->_params['db_table']);
101                App::logMsg(sprintf('Dropping and recreating table %s.', $this->_params['db_table']), LOG_DEBUG, __FILE__, __LINE__);
102            }
103            $this->db->query("CREATE TABLE IF NOT EXISTS " . $this->_params['db_table'] . " (
104                session_id char(32) NOT NULL default '',
105                session_data mediumtext NOT NULL,
106                last_access timestamp(14) NOT NULL,
107                PRIMARY KEY (session_id),
108                KEY last_access (last_access)
109            )");
110           
111            if (!$this->db->columnExists($this->_params['db_table'], array('session_id', 'session_data', 'last_access'))) {
112                App::logMsg(sprintf('Database table %s has invalid columns. Please update this table manually.', $this->_params['db_table']), LOG_ALERT, __FILE__, __LINE__);
113                trigger_error(sprintf('Database table %s has invalid columns. Please update this table manually.', $this->_params['db_table']), E_USER_ERROR);
114            }
115        }   
116        $_db_tested = true;
117    }
118
119    function dbSessionOpen($save_path, $sess_name)
120    {
121        return true; 
122    }
123   
124    function dbSessionClose()
125    {
126        return true;
127    }
128   
129    function dbSessionRead($session_id)
130    {
131        // Select the data belonging to session $session_id from the session table   
132        $qid = $this->db->query("SELECT session_data FROM " . $this->_params['db_table'] . " WHERE session_id = '" . addslashes($session_id) . "'");
133       
134        // Return the session data that was found
135        if (mysql_num_rows($qid) == 1) {
136            $row = mysql_fetch_row($qid);
137            return $row[0];
138        }
139       
140        // NOTICE: Output is expected to be an empty string always rather than 'false'.
141        return '';
142    }
143   
144    function dbSessionWrite($session_id, $session_data)
145    {   
146        // Write the serialized session data ($session_data) to the session table
147        $this->db->query("REPLACE INTO " . $this->_params['db_table'] . "(session_id, session_data, last_access) VALUES ('" . addslashes($session_id) . "', '" . addslashes($session_data) . "', null)");
148           
149        return true;     
150    }
151   
152    function dbSessionDestroy($session_id)
153    {
154        // Delete from the table all data for the session $session_id
155        $this->db->query("DELETE FROM " . $this->_params['db_table'] . " WHERE session_id = '" . addslashes($session_id) . "'");
156   
157        return true;     
158    }
159   
160    function dbSessionGarbage($max_lifetime=4000)
161    {
162        // Delete old values from the session table
163        $qid = $this->db->query("DELETE FROM " . $this->_params['db_table'] . " WHERE UNIX_TIMESTAMP(last_access) < " . (time() - $max_lifetime));
164           
165        return true;     
166    }
167}
168
169?>
Note: See TracBrowser for help on using the repository browser.