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

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

slight cleanup

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