Часто на сайтах можно видите фразу, сейчас данный сайт просматривает столько-то человек, или даже список зарегистрированных посетителей, находящихся в данным момент на сайте. Обычно такой сервис называют "Список посетителей OnLine". Учитывая, что у посетителя может динамически меняться IP-адрес, или наоборот несколько посетителей могут выходить в Интернет из под одного IP-адреса, для подсчёта уникальных посетителей на сайте прибегают к сессиям. Создадим таблицу session в которой будем хранить уникальные идентификаторы сессии (SID), назначенные посетителям.
Таблица session
[code]
CREATE TABLE session (
id_session tinytext NOT NULL,
putdate datetime NOT NULL default '0000-00-00 00:00:00',
user tinytext NOT NULL
) TYPE=MyISAM;
[/code]
Таблица имеет три поля - id_session, поле, куда помещается SID сессии, поле putdate, для того, хранения времени обращения посетителя к страницам сайта и поле user, которое нами использоваться не будет, но в котором можно хранить имя пользователя, если у вас имеется система авторизации и вы хотите различать гостей и авторизованных пользователей. Предполагается, что имя пользователя помещается в элемент суперглобального массива $_SESSION['user'] - если вас интересует авторизация на PHP, с нейм можно ознакомиться по ссылке
В начало каждой страницы сайта, которая будет участвовать в регистрации посетителей следует при помощи конструкции require_once() поместить следующий код.
Скрипт регистрации посетителей в таблице session
[code]
<?php
// Начинаем сессию
session_start();
// Получаем уникальный id сессии
$id_session = session_id();
// Устанавливаем соединение с базой данных
include "config.php";
// Проверяем, присутствует ли такой id в базе данных
$query = "SELECT * FROM session
WHERE id_session = '$id_session'";
$ses = mysql_query($query);
if(!$ses) exit("<p>Ошибка в запросе к таблице сессий</p>");
// Если сессия с таким номером уже существует,
// значит пользователь online - обновляем время его
// последнего посещения
if(mysql_num_rows($ses)>0)
{
$query = "UPDATE session SET putdate = NOW(),
user = '$_SESSION[user]'
WHERE id_session = '$id_session'";
mysql_query($query);
}
// Иначе, если такого номера нет - посетитель только что
// вошёл - помещаем в таблицу нового посетителя
else
{
$query = "INSERT INTO session
VALUES('$id_session', NOW(), '$_SESSION[user]')";
if(!mysql_query($query))
{
echo $query."<br>";
echo "<p>Ошибка при добавлении пользователя</p>";
exit();
}
}
// Будем считать, что пользователи, которые отсутствовали
// в течении 20 минут - покинули ресурс - удаляем их
// id_session из базы данных
$query = "DELETE FROM session
WHERE putdate < NOW() - INTERVAL '20' MINUTE";
mysql_query($query);
?>
[/code]
Протокол HTTP не является сессионным протоколом, поэтому мы можем фиксировать только обращения посетителей к страницам сайта - сколько после этого посетитель будет читать страницу - одному богу известно - получить эту информацию мы не сможем. Поэтому мы будем считать, что если посетиель не обращается к страницам сайта более 20 минут - он ушёл и его можно удалять из таблицы session.
Теперь нам остаётся только вывести содержимое таблицы session или подсчитать число посетителей в ней.
Выводим содержимое таблицы session
[code]<?php
// Устанавливаем соединение с базой данных
include "config.php";
// Выводим имена всех посетителей, записи о которых имеются
// в таблице session
$query = "SELECT * FROM session";
$ath = mysql_query($query);
if(!$ath) exit("<p>Ошибка в запросе к таблице сессий</p>");
// Если хоть кто-то есть - выводим таблицу
if(mysql_num_rows($ath)>0)
{
echo "<table>";
while($author = mysql_fetch_array($ath))
{
// Если посетитель не зарегистрирован
// выводим вместо его имени - "аноним"
if(empty($author['user'])) echo "<tr><td>аноним</td></tr>";
else echo "<tr><td>".$author['user']."</td></tr>";
}
echo "</table>";
}
?>[/code]
Для установки соединения с базой данных, нам потребуется конфигурационный файл config.php, следующего содержания.
Конфигурационный файл config.php
[code]<?php
////////////////////////////////////////////////////////////
// 2003-2011 (C) IT-студия SoftTime (http://www.softtime.ru)
////////////////////////////////////////////////////////////
// сейчас выставлен сервер локальной машины
$dblocation = "localhost";
// Имя базы данных, на хостинге или локальной машине
$dbname = "dbase";
// Имя пользователя базы данных
$dbuser = "root";
// и его пароль
$dbpasswd = "";
// Устанавливаем соединение с базой данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) {
exit( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
}
// Выбираем базу данных
if (! @mysql_select_db($dbname,$dbcnx) ) {
exit( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
}
// Устанавливаем кодировку соединения
@mysql_query("SET NAMES 'cp1251'");
?>
[/code]