1:<?php
   2:
   3://
   4:// setup_db_sessions -
   5://
   6:// Stores the configuration parameters for the database handling of sessions, and sets the 
   7:// session handler routines.
   8://
   9:// Returns true on success, or false on error.
  10://
  11:function setup_db_sessions( $dbName, $dbUserName="", $dbPassword="", $dbHostName="localhost" )
  12:{
  13:    global $DBSessionData;
  14:    
  15:    //
  16:    // Save our configuration data.
  17:    //
  18:    
  19:    $DBSessionData['dbName'] = $dbName;
  20:    $DBSessionData['dbUserName'] = $dbUserName;
  21:    $DBSessionData['dbPassword'] = $dbPassword;
  22:    $DBSessionData['dbHostName'] = $dbHostName;
  23:    $DBSessionData['dbLinkHandle'] = false;
  24:    
  25:    //
  26:    // Set the save handlers
  27:    //
  28:    
  29:    return session_set_save_handler( "on_session_start",   
  30:                                     "on_session_end",
  31:                                     "on_session_read",    
  32:                                     "on_session_write",
  33:                                     "on_session_destroy",
  34:                                     "on_session_gc" ); 
  35:}
  36:
  37:function on_session_start($save_path, $session_name) 
  38:{
  39:    global $DBSessionData;
  40:    
  41:    $dbName = $DBSessionData['dbName'];
  42:    $dbUserName = $DBSessionData['dbUserName'];
  43:    $dbPassword = $DBSessionData['dbPassword'];
  44:    $dbHostName = $DBSessionData['dbHostName'];
  45:
  46:    //
  47:    // Step 1. Try to connect to the database server.   
  48:    //
  49:        
  50:    $dbLinkHandle= mysql_connect( $dbHostName, $dbUserName, $dbPassword );
  51:    $DBSessionData['dbLinkHandle'] = $dbLinkHandle;
  52:    
  53:    if( false != $dbLinkHandle )
  54:    {
  55:        //
  56:        // If we were successful, try to change to the proper database.
  57:        //
  58:        
  59:        if( false != mysql_select_db( $dbName, $dbLinkHandle) )
  60:        {
  61:            //
  62:            // Now, check to see if the table exists. If not, then create it.
  63:            //
  64:            
  65:            if( mysql_num_rows( mysql_query( "SHOW TABLES LIKE '".$table."'" , $dbLinkHandle ) ) < 1 )
  66:            {
  67:                $query = " CREATE TABLE session_data ( ".
  68:                         " session_id varchar(32) NOT NULL, ".
  69:                         " session_text text NOT NULL, ".
  70:                         " session_expr_dt timestamp NOT NULL, ".
  71:                         " PRIMARY KEY  (session_id) ".
  72:                         " }";
  73:                         
  74:                if( false == mysql_query( $query, $dbLinkHandle ) )
  75:                {
  76:                    //
  77:                    // Error creating table.
  78:                    //
  79:                    error_log("Error creating session table ".$dbName.".session.data: ".mysql_error($dbLinkHandle));
  80:                    return false;
  81:                }
  82:            }
  83:            
  84:        }
  85:        else
  86:        {
  87:            //
  88:            // Error selecting the database.
  89:            //
  90:            error_log("Error selecting session database (".$dbName."): ".mysql_error($dbLinkHandle));
  91:            return false;
  92:        }
  93:    }
  94:    else
  95:    {
  96:        //
  97:        // Error connecting to the database.
  98:        //
  99:        error_log("Error connecting to the session database (".$dbName."): ".mysql_error($dbLinkHandle));
 100:        return false;
 101:    }
 102:    
 103:    return true;
 104:}
 105:
 106:function on_session_end() 
 107:{
 108:    global $DBSessionData;
 109:
 110:    if( false != $DBSessionData['dbLinkHandle'] )
 111:    {
 112:        if ( false == mysql_close( $DBSessionData['dbLinkHandle'] ))
 113:        {
 114:            //
 115:            // Error closing the database connection.
 116:            //
 117:            error_log("Error disconnecting from the session database (".$DBSessionData['dbName']."): ".mysql_error($DBSessionData['dbLinkHandle']));
 118:            return false;
 119:        }
 120:        
 121:        $DBSessionData['dbLinkHandle'] = false;
 122:    }
 123:    
 124:    return true;
 125:}
 126:
 127:function on_session_read($key) 
 128:{
 129:    global $DBSessionData;
 130:
 131:    if( false != $DBSessionData['dbLinkHandle'] )
 132:    {
 133:        $dbLinkHandle = $DBSessionData['dbLinkHandle'];
 134:        
 135:        $query = "select session_text from session_data ".
 136:                 " where session_id ='".mysql_real_escape_string(stripslashes($key))."' ".
 137:                 "   and unix_timestamp(session_expiration) > unix_timestamp(now())";
 138:             
 139:        $result = mysql_query( $query, $dbLinkHandle );
 140:
 141:        if( $result )
 142:        {
 143:            $row = mysql_fetch_array( $result );
 144:            return( $row['session_data'] );
 145:        }
 146:        else
 147:        {
 148:           return "";
 149:        }
 150:    }
 151:    else
 152:    {
 153:        return "";
 154:    }
 155:}
 156:
 157:function on_session_write($key, $val) 
 158:{
 159:    global $DBSessionData;
 160:
 161:    if( false != $DBSessionData['dbLinkHandle'] )
 162:    {
 163:        $dbLinkHandle = $DBSessionData['dbLinkHandle'];
 164:
 165:        //
 166:        // If the database connection is established (i.e. we're using sessions) prepare the queries.
 167:        // Note that we will update the session life span when we update a saved session.
 168:        //
 169:        
 170:        $sessionLifetime = get_cfg_var("session.gc_maxlifetime")
 171:    
 172:        $insert_stmt  = "insert into session_data values('".mysql_real_escape_string(stripslashes($key))."', ".
 173:                        "'".mysql_real_escape_string(stripslashes($val))."',unix_timestamp(date_add(now(), interval 1 hour)))";
 174:
 175:        $update_stmt  = "update session_data set session_text ='".mysql_real_escape_string(stripslashes($val))."', ".
 176:                        "session_expiration = unix_timestamp(now() + {$sessionLifetime})";.
 177:                        "where session_id ='".mysql_real_escape_string(stripslashes($key))." '";
 178:    
 179:
 180:        //
 181:        // To save some time in processing, we'll try to do the insert. If that doesn't work,
 182:        // we must assume that the session is already in the database, and try an update. 
 183:        // If that doesn't work, we return an error.
 184:        // This saves us a query over the alternative where we do a check, then either an update
 185:        // or insert. With that alternate design, we will always do 2 queries instead of 1 with the
 186:        // outside chance of doing 2.
 187:        //      
 188:        
 189:        $retult = mysql_query( $insert_stmt, $dbLinkHandle );
 190:        
 191:        if( !$result )
 192:        {
 193:            error_log( mysql_error());
 194:            
 195:            $result = mysql_query( $update_stmt, $dbLinkHandle );           
 196:            
 197:            if( !$result )
 198:            {
 199:                //
 200:                // Error saving the session data.
 201:                //
 202:                error_log("Error writing session data to the database (".$DBSessionData['dbName'].".session_data): ".mysql_error($DBSessionData['dbLinkHandle']));
 203:                return false;
 204:            }           
 205:        }  
 206:    }
 207:    
 208:    return true;
 209:}
 210:
 211:function on_session_destroy($key) 
 212:{
 213:    global $DBSessionData;
 214:
 215:    if( false == $DBSessionData['dbLinkHandle'] )
 216:    {
 217:        $dbName = $DBSessionData['dbName'];
 218:        $dbUserName = $DBSessionData['dbUserName'];
 219:        $dbPassword = $DBSessionData['dbPassword'];
 220:        $dbHostName = $DBSessionData['dbHostName'];
 221:        
 222:        $dbLinkHandle= mysql_connect( $dbHostName, $dbUserName, $dbPassword );
 223:        $DBSessionData['dbLinkHandle'] = $dbLinkHandle;
 224:        
 225:        $dbName = $DBSessionData['dbName'];
 226:        $dbUserName = $DBSessionData['dbUserName'];
 227:        $dbPassword = $DBSessionData['dbPassword'];
 228:        $dbHostName = $DBSessionData['dbHostName'];
 229:        
 230:        $dbLinkHandle= mysql_connect( $dbHostName, $dbUserName, $dbPassword );
 231:        $DBSessionData['dbLinkHandle'] = $dbLinkHandle;
 232:
 233:        if( false != $dbLinkHandle ) 
 234:        {
 235:            if (false == mysql_select_db( $dbName, $dbLinkHandle) )
 236:                error_log("Error selecting session database (".$dbName."): ".mysql_error($dbLinkHandle));
 237:        }
 238:        else
 239:        {
 240:            error_log("Error connecting to the session database (".$dbName."): ".mysql_error($dbLinkHandle));   
 241:        }
 242:    }
 243:
 244:    if( false != $DBSessionData['dbLinkHandle'] )
 245:    {
 246:        mysql_query( "delete from sessions where session_id = '".mysql_real_escape_string(stripslashes($key))."'", $DBSessionData['dbLinkHandle'] );
 247:    }
 248:
 249:    return true;
 250:}
 251:
 252:function on_session_gc($max_lifetime) 
 253:{
 254:    global $DBSessionData;
 255:
 256:    if( false == $DBSessionData['dbLinkHandle'] )
 257:    {
 258:        $dbName = $DBSessionData['dbName'];
 259:        $dbUserName = $DBSessionData['dbUserName'];
 260:        $dbPassword = $DBSessionData['dbPassword'];
 261:        $dbHostName = $DBSessionData['dbHostName'];
 262:        
 263:        $dbLinkHandle= mysql_connect( $dbHostName, $dbUserName, $dbPassword );
 264:        $DBSessionData['dbLinkHandle'] = $dbLinkHandle;
 265:
 266:        if( false != $dbLinkHandle ) 
 267:        {
 268:            if (false == mysql_select_db( $dbName, $dbLinkHandle) )
 269:                error_log("Error selecting session database (".$dbName."): ".mysql_error($dbLinkHandle));
 270:        }
 271:        else
 272:        {
 273:            error_log("Error connecting to the session database (".$dbName."): ".mysql_error($dbLinkHandle));   
 274:        }
 275:        
 276:    }
 277:    if( false != $DBSessionData['dbLinkHandle'] )
 278:    {
 279:        mysql_query( "delete from sessions where unix_timestamp(session_expiration) < unix_timestamp(now())", $DBSessionData['dbLinkHandle'] );
 280:    }
 281:    
 282:    return true;
 283:}
 284:    
 285:            
 286://
 287:// Use these steps in your program...
 288://
 289:
 290:setup_db_sessions( "session_database_name", "database_user_name", "database_password", "optional_host_name");
 291:session_id( $yourCustomSessionID );
 292:session_start();
 293:
 294:?> 
 295: