?? adodb-session.php
字號:
if (!is_object($rs)) { return; } require_once ADODB_SESSION.'/../tohtml.inc.php'; rs2html($rs); } ///////////////////// // public methods ///////////////////// /*! 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'); // cannot use =& below - do not know why... $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 $binary sesskey = $qkey AND expiry >= " . time(); $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) { $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; } 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>'; } $sql = "UPDATE $table SET expiry = ".$conn->Param('0')." WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= ".$conn->Param('2'); $rs =& $conn->Execute($sql,array($expiry,$key,time())); ADODB_Session::_dumprs($rs); if ($rs) { $rs->Close(); } 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); ADODB_Session::_dumprs($rs); } 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; } // do we insert or update? => as for sesskey $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey"); ADODB_Session::_dumprs($rs); if ($rs && reset($rs->fields) > 0) { $sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value WHERE sesskey = $qkey"; } else { $sql = "INSERT INTO $table (expiry, $data, sesskey) VALUES ($expiry, $lob_value, $qkey)"; } if ($rs) { $rs->Close(); } $err = ''; $rs1 =& $conn->Execute($sql); ADODB_Session::_dumprs($rs1); if (!$rs1) { $err = $conn->ErrorMsg()."\n"; } $rs2 =& $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob)); ADODB_Session::_dumprs($rs2); if (!$rs2) { $err .= $conn->ErrorMsg()."\n"; } $rs = ($rs && $rs2) ? true : false; if ($rs1) { $rs1->Close(); } if (is_object($rs2)) { $rs2->Close(); } } 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(); } } } 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(); $sync_seconds = ADODB_Session::syncSeconds(); $table = ADODB_Session::table(); if (!$conn) { return false; } assert('$table'); $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->BeginTrans(); $keys = array(); while (!$rs->EOF) { $ref = $rs->fields[0]; $key = $rs->fields[1]; $fn($ref, $key); $del = $conn->Execute("DELETE FROM $table WHERE sesskey='$key'"); $rs->MoveNext(); } $rs->Close(); $conn->CommitTrans(); } } 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) { global $HTTP_SERVER_VARS; $msg = __FILE__ . ": Server time for webserver {$HTTP_SERVER_VARS['HTTP_HOST']} not in synch with database: " . " database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 3600) . ' hours)'; error_log($msg); if ($debug) { ADOConnection::outp("<p>$msg</p>"); } } } } return true; }}ADODB_Session::_init();// 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 + -