⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adodb-session2.php

📁 Typo3, 开源里边最强大的
💻 PHP
📖 第 1 页 / 共 2 页
字号:
			array('ADODB_Session', 'gc')		);	}	/*!	*/	function _sessionKey() {		// use this function to create the encryption key for crypted sessions		// crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt		return crypt(ADODB_Session::encryptionKey(), session_id());	}	/*!	*/	function _dumprs($rs) {		$conn	=& ADODB_Session::_conn();		$debug	= ADODB_Session::debug();		if (!$conn) {			return;		}		if (!$debug) {			return;		}		if (!$rs) {			echo "<br />\$rs is null or false<br />\n";			return;		}		//echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";		if (!is_object($rs)) {			return;		}		require_once ADODB_SESSION.'/../tohtml.inc.php';		rs2html($rs);	}	/////////////////////	// public methods	/////////////////////		function config($driver, $host, $user, $password, $database=false,$options=false)	{		ADODB_Session::driver($driver);		ADODB_Session::host($host);		ADODB_Session::user($user);		ADODB_Session::password($password);		ADODB_Session::database($database);				if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';				if (isset($options['table'])) ADODB_Session::table($options['table']);		if (isset($options['lob'])) ADODB_Session::clob($options['lob']);		if (isset($options['debug'])) ADODB_Session::debug($options['debug']);	}	/*!		Create the connection to the database.		If $conn already exists, reuse that connection	*/	function open($save_path, $session_name, $persist = null) 	{		$conn =& ADODB_Session::_conn();		if ($conn) {			return true;		}		$database	= ADODB_Session::database();		$debug		= ADODB_Session::debug();		$driver		= ADODB_Session::driver();		$host		= ADODB_Session::host();		$password	= ADODB_Session::password();		$user		= ADODB_Session::user();		if (!is_null($persist)) {			ADODB_Session::persist($persist);		} else {			$persist = ADODB_Session::persist();		}# these can all be defaulted to in php.ini#		assert('$database');#		assert('$driver');#		assert('$host');		$conn =& ADONewConnection($driver);		if ($debug) {			$conn->debug = true;					ADOConnection::outp( " driver=$driver user=$user db=$database ");		}				if ($persist) {			switch($persist) {			default:			case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;			case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;			case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;			}		} else {			$ok = $conn->Connect($host, $user, $password, $database);		}		if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;		else			ADOConnection::outp('<p>Session: connection failed</p>', false);				return $ok;	}	/*!		Close the connection	*/	function close() 	{/*		$conn =& ADODB_Session::_conn();		if ($conn) $conn->Close();*/		return true;	}	/*		Slurp in the session variables and return the serialized string	*/	function read($key) 	{		$conn	=& ADODB_Session::_conn();		$filter	= ADODB_Session::filter();		$table	= ADODB_Session::table();		if (!$conn) {			return '';		}		//assert('$table');		$qkey = $conn->quote($key);		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';			$sql = "SELECT sessdata FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . $conn->sysTimeStamp;		/* Lock code does not work as it needs to hold transaction within whole page, and we don't know if 		  developer has commited elsewhere... :(		 */		#if (ADODB_Session::Lock())		#	$rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata);		#else					$rs =& $conn->Execute($sql);		//ADODB_Session::_dumprs($rs);		if ($rs) {			if ($rs->EOF) {				$v = '';			} else {				$v = reset($rs->fields);				$filter = array_reverse($filter);				foreach ($filter as $f) {					if (is_object($f)) {						$v = $f->read($v, ADODB_Session::_sessionKey());					}				}				$v = rawurldecode($v);			}			$rs->Close();			ADODB_Session::_crc(strlen($v) . crc32($v));			return $v;		}		return '';	}	/*!		Write the serialized data to a database.		If the data has not been modified since the last read(), we do not write.	*/	function write($key, $val) 	{	global $ADODB_SESSION_READONLY;			if (!empty($ADODB_SESSION_READONLY)) return;				$clob			= ADODB_Session::clob();		$conn			=& ADODB_Session::_conn();		$crc			= ADODB_Session::_crc();		$debug			= ADODB_Session::debug();		$driver			= ADODB_Session::driver();		$expire_notify	= ADODB_Session::expireNotify();		$filter			= ADODB_Session::filter();		$lifetime		= ADODB_Session::lifetime();		$table			= ADODB_Session::table();			if (!$conn) {			return false;		}			$sysTimeStamp = $conn->sysTimeStamp;				//assert('$table');		$expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp);		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';		// crc32 optimization since adodb 2.1		// now we only update expiry date, thx to sebastian thom in adodb 2.32		if ($crc !== false && $crc == (strlen($val) . crc32($val))) {			if ($debug) {				echo '<p>Session: Only updating date - crc32 not changed</p>';			}						$expirevar = '';			if ($expire_notify) {				$var = reset($expire_notify);				global $$var;				if (isset($$var)) {					$expirevar = $$var;				}			}									$sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp";			$rs =& $conn->Execute($sql,array($expirevar,$key));			return true;		}		$val = rawurlencode($val);		foreach ($filter as $f) {			if (is_object($f)) {				$val = $f->write($val, ADODB_Session::_sessionKey());			}		}		$expireref = '';		if ($expire_notify) {			$var = reset($expire_notify);			global $$var;			if (isset($$var)) {				$expireref = $$var;			}		} 		if (!$clob) {	// no lobs, simply use replace()			$rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));			if ($rs) $rs->Close();								if ($rs && reset($rs->fields) > 0) {				$sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2');							} else {				$sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) 					VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)";			}							$rs =& $conn->Execute($sql,array($val,$expireref,$key));					} else {			// what value shall we insert/update for lob row?			switch ($driver) {				// empty_clob or empty_lob for oracle dbs				case 'oracle':				case 'oci8':				case 'oci8po':				case 'oci805':					$lob_value = sprintf('empty_%s()', strtolower($clob));					break;				// null for all other				default:					$lob_value = 'null';					break;			}						$conn->StartTrans();						$rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));			if ($rs) $rs->Close();								if ($rs && reset($rs->fields) > 0) {				$sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1');							} else {				$sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified) 					VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)";			}						$rs =& $conn->Execute($sql,array($expireref,$key));						$qkey = $conn->qstr($key);			$rs2 =& $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob));			$rs = $conn->CompleteTrans();								}		if (!$rs) {			ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);			return false;		}  else {			// bug in access driver (could be odbc?) means that info is not committed			// properly unless select statement executed in Win2000			if ($conn->databaseType == 'access') {				$sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";				$rs =& $conn->Execute($sql);				ADODB_Session::_dumprs($rs);				if ($rs) {					$rs->Close();				}			}		}/*		if (ADODB_Session::Lock()) {			$conn->CommitTrans();		}*/		return $rs ? true : false;	}	/*!	*/	function destroy($key) {		$conn			=& ADODB_Session::_conn();		$table			= ADODB_Session::table();		$expire_notify	= ADODB_Session::expireNotify();		if (!$conn) {			return false;		}		//assert('$table');		$qkey = $conn->quote($key);		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';		if ($expire_notify) {			reset($expire_notify);			$fn = next($expire_notify);			$savem = $conn->SetFetchMode(ADODB_FETCH_NUM);			$sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";			$rs =& $conn->Execute($sql);			ADODB_Session::_dumprs($rs);			$conn->SetFetchMode($savem);			if (!$rs) {				return false;			}			if (!$rs->EOF) {				$ref = $rs->fields[0];				$key = $rs->fields[1];				//assert('$ref');				//assert('$key');				$fn($ref, $key);			}			$rs->Close();		}		$sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";		$rs =& $conn->Execute($sql);		ADODB_Session::_dumprs($rs);		if ($rs) {			$rs->Close();		}		return $rs ? true : false;	}	/*!	*/	function gc($maxlifetime) 	{		$conn			=& ADODB_Session::_conn();		$debug			= ADODB_Session::debug();		$expire_notify	= ADODB_Session::expireNotify();		$optimize		= ADODB_Session::optimize();		$table			= ADODB_Session::table();		if (!$conn) {			return false;		}		//assert('$table');		$time = $conn->sysTimeStamp;		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';		if ($expire_notify) {			reset($expire_notify);			$fn = next($expire_notify);			$savem = $conn->SetFetchMode(ADODB_FETCH_NUM);			$sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";			$rs =& $conn->Execute($sql);			ADODB_Session::_dumprs($rs);			$conn->SetFetchMode($savem);			if ($rs) {				$conn->StartTrans();				$keys = array();				while (!$rs->EOF) {					$ref = $rs->fields[0];					$key = $rs->fields[1];					$fn($ref, $key);					$del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));					$rs->MoveNext();				}				$rs->Close();								$conn->CompleteTrans();			}		} else {					if (0) {				$sql = "SELECT sesskey FROM $table WHERE expiry < $time";				$arr =& $conn->GetAll($sql);				foreach ($arr as $row) {					$sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0');					$conn->Execute($sql2,array($row[0]));				}			} else {				$sql = "DELETE FROM $table WHERE expiry < $time";				$rs =& $conn->Execute($sql);				ADODB_Session::_dumprs($rs);				if ($rs) $rs->Close();			}			if ($debug) {				ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");			}		}		// suggested by Cameron, "GaM3R" <gamr@outworld.cx>		if ($optimize) {			$driver = ADODB_Session::driver();			if (preg_match('/mysql/i', $driver)) {				$sql = "OPTIMIZE TABLE $table";			}			if (preg_match('/postgres/i', $driver)) {				$sql = "VACUUM $table";			}			if (!empty($sql)) {				$conn->Execute($sql);			}		}				return true;	}}ADODB_Session::_init();if (empty($ADODB_SESSION_READONLY))	register_shutdown_function('session_write_close');// for backwards compatability onlyfunction adodb_sess_open($save_path, $session_name, $persist = true) {	return ADODB_Session::open($save_path, $session_name, $persist);}// for backwards compatability onlyfunction adodb_sess_gc($t){		return ADODB_Session::gc($t);}?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -