Модуль "Пользователи онлайн"
В догонку к запоздалой сегодняшней статье про "Облако тегов" пишу сразу вторую про создание модуля "Пользователи онлайн".
В создании данного модуля нам понадобится таблица в базе данных MySQL и для работы с этим модулем напишем класс.
Таблицу в базе данных назовем tbl_online, будет отвечать за хранение данных об 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;
Рассмотрим класс модуля "Пользователи онлайн":
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 секунд
Итак, чтобы воспользоваться данным классом, напишем следующий код:
$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 минут.
И самое последнее, но самое главное - это вывод блока на странице
$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'])." ";
?>
Скачать модуль: "http://phpprogs.ru/uploads/onlineUsers20100604.zip;"
Отвечу на любые вопросы.

Может Вы еще напишите модуль для регистрации и авторизации пользователей у себя на сайте. А так же было бы не плохо, пример скрипта аккаунта пользователя!!! спасибо!

Это всё будет в цикле статей об написании CMS
Отвечу на вопросы по PHP

Спасибо за скрипты. Только чевото не выходит внедрить в свой двиг. В коде вывода блока на страницу, выскакивает ошибка: syntax error, unexpected '{' , в четвертой строке. И куда этот код с $seconds вставлять, на всех страницах?

Внизу статьи есть ссылка на архив со скриптом, скачайте его, он точно работает.
Вам необходимо изначально сделать include класса по работе с MySQL. $second Вы можете вынесли в свойства класса и тогда его не надо передавать в скриптах, т.е. сделать типа такого:
class online extends sql_db {
var $second = 30;
...
А из параметров методов класса убрать $second, а в самих методах вместо $second поставить $this->second
Отвечу на вопросы по PHP

Я почти ноль в php
что такое это $modules['online']['user'];?
и можно ли создать архив модуля со всеми классами вместе.?
