|
||
Ответить |
|
#1
|
|
Вес репутации:
0
Регистрация: 12.09.2010
Сообщений: 335
Сказал(а) спасибо: 157
Спасибок 243
в 119 сообщениях |
Модуль "Пользователи онлайн" [PHP] -
29.03.2011, 17:42
В создании данного модуля нам понадобится таблица в базе данных MySQL и для работы с этим модулем напишем класс. Таблицу в базе данных назовем tbl_online, будет отвечать за хранение данных об online пользователях и будет она следующей структуры: CREATE TABLE `tbl_online` ( `id` int(10) unsigned NOT NULL auto_increment, `id_user` int(10) unsigned NOT NULL, `login` char(50) NOT NULL, `isbot` enum('yes','no') NOT NULL, `lastdate` int(10) unsigned NOT NULL, `sid` varchar(50) NOT NULL, PRIMARY KEY (`id`), KEY `IDX_DT` (`lastdate`), KEY `IDX_SID` (`sid`), KEY `IDX_LOGIN` (`login`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; Рассмотрим класс модуля "Пользователи онлайн": <php class online extends sql_db { // construncor function online($sqlserver, $sqluser, $sqlpassword, $database) { $db = parent::sql_db($sqlserver, $sqluser, $sqlpassword, $database, false); } function listOnlineUsers($second) { $sql = "SELECT id_user, login, isbot, count(*) as total FROM tbl_online t where lastdate>=".(time()-$second)." group by login;"; parent::sql_query($sql); $rowset = parent::sql_fetchrowset(); if (!empty($rowset) and count($rowset)>0) { $result = array(); foreach ($rowset as $row) { if ($row['isbot'] == "yes") $result['bot'][] = $row; else if ($row['login'] == "guest") $result['guest'] = $row; else $result['user'][] = $row; } return $result; } else return false; } function isBot() { $bots = array( ); $userAgent = $_SERVER['HTTP_USER_AGENT']; foreach($bots as $key => $value) { if(strstr(strtolower($userAgent), strtolower($key))) { $bot = $value; } } return (isset($bot)? $bot: ""); } function onlineUserUpdate($cid) { $sql = "select count(*) as total from tbl_online where sid='{$cid}'"; parent::sql_query($sql); $total = parent::sql_fetchrow(); if ($total['total'] > 0) { $sql = "update tbl_online set lastdate=".time().(isset($_SESSION['auth']) && $_SESSION['auth']==1? ", login='".addslashes($_SESSION['name'])."'": ", login='guest'")." where sid='{$cid}'"; parent::sql_query($sql); } else { if (isset($_SESSION['auth']) && $_SESSION['auth']==1) { $login = $_SESSION['name']; $id_user = $_SESSION['id']; $isbot = 'no'; } else { $result = $this->isbot(); if ($result != "") { $login = $result; $id_user = 0; $isbot = 'yes'; } else { $login = "guest"; $id_user = 0; $isbot = 'no'; } } $sql = "insert into tbl_online (login, isbot, lastdate, sid, id_user) VALUES ('".addslashes($login)."', '{$isbot}', ".time().", '{$cid}', {$id_user});"; parent::sql_query($sql); } } function offlineUserDelete($second) { $sql = "delete from tbl_online where lastdate<".(time()-$second); parent::sql_query($sql); } } ?> Наш новый класс online наследует свойства класса работы с базой данных sql_db. В классе несколько методов: listOnlineUsers($second) - Возвращает список пользователей/ботов, которые были на сайте за последние $second секунд isBot() - определение является ли данный пользователь ботом. Тут видите, что массив $bots не заполнен, просто удалил, а то много информации, полный класс можете скачать по ссылке, расположенной в конце статьи onlineUserUpdate($cid) - обновление информации о пользователе, каждый пользователь посредством сессии получает Session ID, который используется его его идентификации. Предполагается, что изначально активизирована сессия, в ней есть элемент auth, который принимает значение 1, в случае если пользователь авторизирован на Вашем сайте. id и name - это ID и LOGIN пользователя, который активизирован в Вашей системе. offlineUserDelete($second) - собственно метод удаления пользователей из базы активных, если они не были на сайте больше $second секунд Итак, чтобы воспользоваться данным классом, напишем следующий код: <php $seconds = 300; // 5 минут session_start(); $sid = session_id(); $online = new online($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); $online->offlineUserDelete($seconds); $online->onlineUserUpdate($sid); $usersOnline = $online->listOnlineUsers($seconds); ?> Во-второй строке мы инициализируем сессию, а в третьей получаем SID (Session ID). Далее используя данные для подключения к базе данных мы создаем новую переменную из класса online. 5 строка отвечает за удаление неактивных пользователей из таблицы online пользователей. Далее обновляем текущему пользователю состояние активности. И последней строчкой кода мы выбираем из базы активных пользователей, которые находились на сайте в течении последних 5 минут. И самое последнее, но самое главное - это вывод блока на странице <php if (isset($modules['online']['user'])) { $result .= ' Пользователи online:'." "; foreach ($modules['online']['user'] as $key=>$user) { $result .= "<a href="/user/{$user['id_user']}" class="online">".$user['login']."</a>".($key!=count($modules['online']['user'])-1? ", ": ""); } $result .= ' '; } if (isset($modules['online']['bot'])) { $result .= ' Боты: '." "; foreach ($modules['online']['bot'] as $key=>$user) { $result .= $user['login'].($key!=count($modules['online']['bot'])-1? ", ": ""); } $result .= ' '; } if (isset($modules['online']['guest'])) { $result .= ' Гости: '.$modules['online']['guest']['total']." "; $result .= ' '; } $result .= ' Всего: '.((isset($modules['online']['user'])? count($modules['online']['user']): 0)+(isset($modules['online']['bot'])? count($modules['online']['bot']): 0)+@$modules['online']['guest']['total'])." "; ?> "Скачать модуль
|
Ответить |
Опции темы | |
Опции просмотра | |
|
|