\$HTTP_SESSION_VARS['AVAR']={$HTTP_SESSION_VARS['AVAR']}

"; To force non-persistent connections, call adodb_session_open first before session_start(): GLOBAL $HTTP_SESSION_VARS; include('adodb.inc.php'); include('adodb-session.php'); adodb_session_open(false,false,false); session_start(); session_register('AVAR'); $HTTP_SESSION_VARS['AVAR'] += 1; print "

\$HTTP_SESSION_VARS['AVAR']={$HTTP_SESSION_VARS['AVAR']}

"; Installation ============ 1. Create this table in your database (syntax might vary depending on your db): create table sessions ( SESSKEY char(32) not null, EXPIRY int(11) unsigned not null, DATA text not null, primary key (sesskey) ); 2. Then define the following parameters in this file: $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase'; $ADODB_SESSION_CONNECT='server to connect to'; $ADODB_SESSION_USER ='user'; $ADODB_SESSION_PWD ='password'; $ADODB_SESSION_DB ='database'; $ADODB_SESSION_TBL = 'sessions' 3. Recommended is PHP 4.0.6 or later. There are documented session bugs in earlier versions of PHP. */ if (!defined('_ADODB_LAYER')) { include (dirname(__FILE__).'/adodb.inc.php'); } if (!defined('ADODB_SESSION')) { define('ADODB_SESSION',1); /* if database time and system time is difference is greater than this, then give warning */ define('ADODB_SESSION_SYNCH_SECS',60); /****************************************************************************************\ Global definitions \****************************************************************************************/ GLOBAL $ADODB_SESSION_CONNECT, $ADODB_SESSION_DRIVER, $ADODB_SESSION_USER, $ADODB_SESSION_PWD, $ADODB_SESSION_DB, $ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESS_DEBUG, $ADODB_SESSION_CRC; $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime'); if ($ADODB_SESS_LIFE <= 1) { // bug in PHP 4.0.3 pl 1 -- how about other versions? //print "

Session Error: PHP.INI setting session.gc_maxlifetimenot set: $ADODB_SESS_LIFE

"; $ADODB_SESS_LIFE=1440; } $ADODB_SESSION_CRC = false; //$ADODB_SESS_DEBUG = true; ////////////////////////////////// /* SET THE FOLLOWING PARAMETERS */ ////////////////////////////////// if (empty($ADODB_SESSION_DRIVER)) { $ADODB_SESSION_DRIVER='mysql'; $ADODB_SESSION_CONNECT='localhost'; $ADODB_SESSION_USER ='root'; $ADODB_SESSION_PWD =''; $ADODB_SESSION_DB ='xphplens_2'; } // Made table name configurable - by David Johnson djohnson@inpro.net if (empty($ADODB_SESSION_TBL)){ $ADODB_SESSION_TBL = 'sessions'; } /****************************************************************************************\ Create the connection to the database. If $ADODB_SESS_CONN already exists, reuse that connection \****************************************************************************************/ function adodb_sess_open($save_path, $session_name,$persist=true) { GLOBAL $ADODB_SESS_CONN; if (isset($ADODB_SESS_CONN)) return true; GLOBAL $ADODB_SESSION_CONNECT, $ADODB_SESSION_DRIVER, $ADODB_SESSION_USER, $ADODB_SESSION_PWD, $ADODB_SESSION_DB, $ADODB_SESS_DEBUG; // cannot use & below - do not know why... $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER); if (!empty($ADODB_SESS_DEBUG)) { $ADODB_SESS_CONN->debug = true; ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB "); } if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT, $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT, $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB); if (!$ok) ADOConnection::outp( "

Session: connection failed

",false); } /****************************************************************************************\ Close the connection \****************************************************************************************/ function adodb_sess_close() { global $ADODB_SESS_CONN; if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close(); return true; } /****************************************************************************************\ Slurp in the session variables and return the serialized string \****************************************************************************************/ function adodb_sess_read($key) { global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC; $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time()); if ($rs) { if ($rs->EOF) { $v = ''; } else $v = rawurldecode(reset($rs->fields)); $rs->Close(); // new optimization adodb 2.1 $ADODB_SESSION_CRC = strlen($v).crc32($v); return $v; } return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com } /****************************************************************************************\ Write the serialized data to a database. If the data has not been modified since adodb_sess_read(), we do not write. \****************************************************************************************/ function adodb_sess_write($key, $val) { global $ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESSION_TBL, $ADODB_SESS_DEBUG, $ADODB_SESSION_CRC; $expiry = time() + $ADODB_SESS_LIFE; // crc32 optimization since adodb 2.1 // now we only update expiry date, thx to sebastian thom in adodb 2.32 if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) { if ($ADODB_SESS_DEBUG) echo "

Session: Only updating date - crc32 not changed

"; $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time(); $rs = $ADODB_SESS_CONN->Execute($qry); return true; } $val = rawurlencode($val); $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL, array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val), 'sesskey',$autoQuote = true); if (!$rs) { ADOConnection::outp( '

Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'

',false); } else { // bug in access driver (could be odbc?) means that info is not commited // properly unless select statement executed in Win2000 if ($ADODB_SESS_CONN->databaseType == 'access') $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'"); } return !empty($rs); } function adodb_sess_destroy($key) { global $ADODB_SESS_CONN, $ADODB_SESSION_TBL; $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'"; $rs = $ADODB_SESS_CONN->Execute($qry); return $rs ? true : false; } function adodb_sess_gc($maxlifetime) { global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL; $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time(); $ADODB_SESS_CONN->Execute($qry); if ($ADODB_SESS_DEBUG) ADOConnection::outp("

Garbage Collection: $qry

"); // suggested by Cameron, "GaM3R" if (defined('ADODB_SESSION_OPTIMIZE')) { global $ADODB_SESSION_DRIVER; switch( $ADODB_SESSION_DRIVER ) { case 'mysql': case 'mysqlt': $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL; break; case 'postgresql': case 'postgresql7': $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL; break; } if (!empty($opt_qry)) { $ADODB_SESS_CONN->Execute($opt_qry); } } $rs = $ADODB_SESS_CONN->SelectLimit('select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL,1); if ($rs && !$rs->EOF) { $dbt = reset($rs->fields); $rs->Close(); $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbt); $t = time(); if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) { global $HTTP_SERVER_VARS; $msg = "adodb-session.php: Server time for webserver {$HTTP_SERVER_VARS['HTTP_HOST']} not in synch: database=$dbt, webserver=".$t; error_log($msg); if ($ADODB_SESS_DEBUG) ADOConnection::outp("

$msg

"); } } return true; } session_module_name('user'); session_set_save_handler( "adodb_sess_open", "adodb_sess_close", "adodb_sess_read", "adodb_sess_write", "adodb_sess_destroy", "adodb_sess_gc"); } /* TEST SCRIPT -- UNCOMMENT */ if (0) { GLOBAL $HTTP_SESSION_VARS; session_start(); session_register('AVAR'); $HTTP_SESSION_VARS['AVAR'] += 1; ADOConnection::outp( "

\$HTTP_SESSION_VARS['AVAR']={$HTTP_SESSION_VARS['AVAR']}

",false); } ?>