To continue, >click here /endcode *********************************************************************************************************************** Table structure: CREATE TABLE session ( id char(32) NOT NULL default '', LastAction int(10) NOT NULL default '0', ip char(15) NOT NULL default '', userID mediumint(9) default NULL, PRIMARY KEY (id), KEY id (id) ) TYPE=INNODB; CREATE TABLE session_vars ( session varchar(32) NOT NULL default '', value varchar(255) default NULL, id mediumint(8) unsigned NOT NULL auto_increment, PRIMARY KEY (id), UNIQUE KEY sessionID (session), UNIQUE KEY id (id) ) TYPE=INNODB; **********************************************************************************************************************/ session_module_name("user"); // ** session processing functions ** // function killold() { global $g_db; $result = $g_db->get_result("SELECT vars.id FROM session AS sess, session_vars AS vars WHERE sess.id=vars.session AND sess.LastAction < ".(time() - 3600)); if (is_array($result)) { while (list($key,$val) = each($result)) { $g_db->query("DELETE FROM session_vars WHERE id=".$val['id']); } } $g_db->query("DELETE FROM session WHERE LastAction < ".(time()-3600)); $g_db->query("UPDATE session SET userID=NULL WHERE LastAction < ".(time()-900)); } function valid_session($sess) { global $g_db; killold(); if (!$sess) return 0; $tmp = $g_db->get_result("SELECT * FROM session WHERE id='$sess'"); return $tmp; } function begin_session($session) { global $g_db; $g_db->query("INSERT INTO session VALUES ('".$session."',".time().",'".$_SERVER['REMOTE_ADDR']."',NULL)"); } function s_touch($sess) { global $g_db; $g_db->query("UPDATE session SET LastAction=".time()." WHERE id='$sess'"); } function demand_session($session) { if (!valid_session($session)) { begin_session($session); } else { s_touch($session); } } function open ($save_path, $session_name) { global $id, $sess_save_path, $sess_session_name; $sess_save_path = $save_path; $sess_session_name = $session_name; demand_session(session_id()); return true; } function close() { return(true); } function read ($id) { global $g_db, $sess_save_path, $sess_session_name; $result = $g_db->get_array("SELECT value FROM session_vars WHERE session='$id'"); if (!empty($result)) { return $result["value"]; } else { return ""; } } function write ($id, $sess_data) { global $g_db; $sis = $g_db->get_result("SELECT * FROM session_vars WHERE session='$id'"); if (!empty($sis)) { $g_db->query("UPDATE session_vars SET value='$sess_data' WHERE session='$id'"); } else { $g_db->query("INSERT INTO session_vars (session, value) VALUES ('$id', '$sess_data')"); } return true; } function destroy ($id) { global $g_db; $g_db->query("DELETE FROM session WHERE id='$id'"); $g_db->query("DELETE FROM session_vars WHERE session='$id'"); return(true); } function gc ($maxlifetime) { killold(); return true; } // ** end of session processing functions ** // function user_login($userID) { global $g_db; demand_session(session_id()); $g_db->query("UPDATE session SET userID = '$userID' WHERE id='".session_id()."'"); } function logout() { global $g_db; $g_db->query("DELETE FROM session WHERE id='".session_id()."'"); $g_db->query("DELETE FROM session_vars WHERE session='".session_id()."'"); return true; } function user_logged_in() { global $g_db; killold(); $result = $g_db->get_array("SELECT userID FROM session WHERE id='".session_id()."'"); if (!empty($result['userID'])) { return $result['userID']; } else { return false; } } function users_online($who = "all", $interval=1800) { global $g_db; switch ($who) { case "all": $query = "SELECT COUNT(*) AS kiek FROM session WHERE LastAction > ". (time()-$interval); break; case "registered": $query = "SELECT COUNT(*) AS kiek FROM session WHERE userID IS NOT NULL AND LastAction > ". (time()-$interval); break; default: $query = "SELECT COUNT(*) AS kiek FROM session WHERE userID='".$who."' AND LastAction > ". (time()-$interval); break; } $result = $g_db->get_array($query); if ($result) { return $result['kiek']; } else { return false; } } session_set_save_handler ("open", "close", "read", "write", "destroy", "gc"); ?>