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: