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

📄 adodb-session.php

📁 Typo3, 开源里边最强大的
💻 PHP
📖 第 1 页 / 共 2 页
字号:
		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 pwd=$password 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();		$data	= ADODB_Session::dataFieldName();		$filter	= ADODB_Session::filter();		$table	= ADODB_Session::table();		if (!$conn) {			return '';		}		//assert('$table');		$qkey = $conn->quote($key);		$binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';			$sql = "SELECT $data FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . time();		/* 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(), $data);		#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();		$data			= ADODB_Session::dataFieldName();		$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;		}		$qkey = $conn->qstr($key);			//assert('$table');		$expiry = time() + $lifetime;		$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 = ".$conn->Param('0').",expireref=".$conn->Param('1')." WHERE $binary sesskey = ".$conn->Param('2')." AND expiry >= ".$conn->Param('3');			$rs =& $conn->Execute($sql,array($expiry,$expirevar,$key,time()));			return true;		}		$val = rawurlencode($val);		foreach ($filter as $f) {			if (is_object($f)) {				$val = $f->write($val, ADODB_Session::_sessionKey());			}		}		$arr = array('sesskey' => $key, 'expiry' => $expiry, $data => $val, 'expireref' => '');		if ($expire_notify) {			$var = reset($expire_notify);			global $$var;			if (isset($$var)) {				$arr['expireref'] = $$var;			}		}		if (!$clob) {	// no lobs, simply use replace()			$arr[$data] = $conn->qstr($val);			$rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true);					} 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();			$expiryref = $conn->qstr($arr['expireref']);			// do we insert or update? => as for sesskey			$rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey");			if ($rs && reset($rs->fields) > 0) {				$sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value, expireref=$expiryref WHERE  sesskey = $qkey";			} else {				$sql = "INSERT INTO $table (expiry, $data, sesskey,expireref) VALUES ($expiry, $lob_value, $qkey,$expiryref)";			}			if ($rs)$rs->Close();						$err = '';			$rs1 =& $conn->Execute($sql);			if (!$rs1) $err = $conn->ErrorMsg()."\n";						$rs2 =& $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob));			if (!$rs2) $err .= $conn->ErrorMsg()."\n";						$rs = ($rs && $rs2) ? true : false;			$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);		return $rs ? true : false;	}	/*!	*/	function gc($maxlifetime) 	{		$conn			=& ADODB_Session::_conn();		$debug			= ADODB_Session::debug();		$expire_notify	= ADODB_Session::expireNotify();		$optimize		= ADODB_Session::optimize();		$sync_seconds	= ADODB_Session::syncSeconds();		$table			= ADODB_Session::table();		if (!$conn) {			return false;		}		$time			= time();		$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 (1) {				$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);			}		}		if ($sync_seconds) {			$sql = 'SELECT ';			if ($conn->dataProvider === 'oci8') {				$sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')";			} else {				$sql .= $conn->sysTimeStamp;			}			$sql .= " FROM $table";			$rs =& $conn->SelectLimit($sql, 1);			if ($rs && !$rs->EOF) {				$dbts = reset($rs->fields);				$rs->Close();				$dbt = $conn->UnixTimeStamp($dbts);				$t = time();				if (abs($dbt - $t) >= $sync_seconds) {					$msg = __FILE__ .						": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: " .						" database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 60) . ' minutes)';					error_log($msg);					if ($debug) {						ADOConnection::outp("<p>$msg</p>");					}				}			}		}		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 + -