source: branches/2.0singleton/lib/DBSessionHandler.inc.php @ 132

Last change on this file since 132 was 127, checked in by scdev, 18 years ago

Updated App.inc.php thru Hierarchy.inc.php

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