Статистика посещений на PHP
Пожалуй, одна из самых сложных, но в то же время обыденных, задач программиста является создание статистики посещений на PHP. В этой статье я покажу, как её можно сделать наиболее качественной.
Главная задача статистики посещений - это отличить одного пользователя от другого. Но как это сделать? К сожалению, это вообще невозможно. Если различать по IP, то ничего не выйдет. У огромного числа пользователей он динамический. Более того, у разных людей они повторяются. В итоге, 2 разных IP могут принадлежать одному человеку, а один и тот же IP может принадлежать разным людям.
Второй вариант - это отличать по cookie. Пожалуй, это лучший способ на данный момент. Безусловно, при смене браузера или очистки браузера от cookie, пользователь потеряется. Но другого выхода нет, поэтому лично я при статистике посещений на PHP всегда ключевым делаю именно cookie.
На основании этого давайте с Вами разберём, какая таблица в базе нам потребуется. Вот те поля, которые я считаю необходимы для хорошей статистики посещений на PHP:
- id - уникальный идентификатор.
- userhash - cookie пользователя. Данное поле по сути и является ключевым при различении пользователей.
- ip - IP-адрес пользователя.
- uri - страница, на которую пришёл посетитель. Например, /page.html.
- ref - адрес, с которого пришёл посетитель.
- date - дата посещения.
Теперь разберём PHP-код добавления в эту таблицу новой записи:
<?php
$userhash = $_COOKIE["userhash"]; // Узнаём, что за пользователь
if (!$userhash) {
/* Если это новый пользователь, то добавляем ему cookie, уникальные для него */
$userhash = uniqid();
setcookie("userhash", $userhash, 0x6FFFFFFF);
}
$ip = ip2long($_SERVER["REMOTE_ADDR"]); // Преобразуем IP в число
$uri = $_SERVER["REQUEST_URI"]; // Узнаём uri
$ref = $_SERVER["HTTP_REFERER"]; // Узнаём, откуда пришёл
$date = time(); // Берём текущее время
$mysqli = new mysqli("localhost", "root", "", "mydb"); // Соединяемся с базой
$mysqli->query("INSERT INTO `visits` (`userhash`, `ip`, `uri`, `ref`, `date`) VALUES ('$userhash', '$ip', '$uri', '$ref', '$date')"); // Добавляем запись
$mysqli->close(); // Закрываем соединение
?>
Безусловно, данный код надо размещать на всех страницах сайта. И так же он может быть и изменён в зависимости от Вашего движка. Также можно добавлять и другие данные, например, браузер пользователя, ОС и прочее.
И, конечно, данная статистика посещений на PHP не идеальна, но не думаю, что есть лучше. А уж идеала точно нет. В любом случае, если Вам нужно отслеживать пользователя на длительном периоде, то лучше как можно быстрее зарегистрировать его на сайте, а уже дальше отслеживать все его действия по полученному id. И вот это уже будет идеальная статистика.
-
- Михаил Русаков
Комментарии (23):
А так и нужно чтобы при каждом переходе по ссылкам на сайте появлялась новая запись, или нет?
Ответить
Да, так и нужно.
Ответить
По мне так удобнее, просто обновлять ссылку и время, чтобы не загружать лишний раз базу данных, или дажу обновлять а ссылку добавлять через запятую а при выводе разбивать на массив и выводить в списке... А вам как такой вариант?
Ответить
Всё равно нужно при каждом посещении обновлять таблицу, хоть новую запись добавить, хоть через запятую новый адрес записать.
Ответить
Ясно
Ответить
Отлично,надо бы "похимичить" с этим кодом.
Ответить
Михаил, а можете сделать статью про создание графиков статистики по дате или количеству без сторонних библиотек, в виде дополнения к статье? Я очень прошу, просьба размером с голубого кита...
Ответить
Расскажу о создании графиков в PHP на основе данных, но это будет через 2-3 недели.
Ответить
Большое спасибо, будем с нетерпением ждать этой статьи, всё мы точно будет рады... Огромное спасибо, а когда будет статья про спойлер на js? Я вас просил написать и до сих пор жду
Ответить
http://myrusakov.ru/skrytyj-tekst-javascript.html
Ответить
Исправьте там где userhash - cookie резлечение на различение
Ответить
Спасибо, исправил!
Ответить
привет,михаил, как сделать на сайте счетчик просмотров,загрузок,рейтинг,к какому нибудь определенному продукту или файлу.точнее где взять такой скрипт или скрипты?спасибо.
Ответить
Где взять - не знаю, не использую их.
Ответить
Локальный сервер работает, все а скрипт не хочит работать выдает ошибки, Я пока в MySQL не очень вчем дело?
Ответить
Поэтому сначала изучайте MySQL.
Ответить
Хорошо спасибо =)
Ответить
Доброго времени суток, Михаил. Подскажите, пожалуйста, как значение в поле ip представить в обычном для этого поля виде. Т.е. у меня отображается девяти- или десятизначное число, а хотелось бы видеть обычный формат ip-адреса. Спасибо
Ответить
Вероятно Вы про функцию ip2long(). Тогда просто не используйте её.
Ответить
Михаил, а возможно, что лучше использовать куки для реализации системы онлайн пользователей? Ведь они через определенное время удаляются?
Ответить
Виталий, для определения онлайн пользователя их и используют, только по закрытию браузера, а не через определенное время они удаляются.
Ответить
Всем привет, Михаил, подскажите пожалуйста, не могу сам сообразить. Как возможно отсортировать записи по полю userhash ? Меня вполне устраивает этот счетчик, но с "опрятным" выводом чет мучаюсь. Добавил чистку через 30 дней, если кому надо. $days='30'; $date=date('Y-m-d H:i:s'); $del_date = new DateTime($date); $del_date->modify("+".$days." day"); $del_date=$del_date->format('Y-m-d H:i:s'); $userhash = $_COOKIE["userhash"]; if (!$userhash) { $userhash = uniqid(); setcookie("userhash", $userhash, 0x6FFFFFFF); } $ip = ip2long($_SERVER["REMOTE_ADDR"]); $uri = $_SERVER["REQUEST_URI"]; $ref = $_SERVER["HTTP_REFERER"]; mysql_query("INSERT INTO visits (userhash,ip,uri,ref,date,del) VALUES ('$userhash', '$ip', '$uri', '$ref', '$date', '$del_date')",$db); mysql_query ("DELETE FROM visits WHERE del < NOW()");
Ответить
Всем привет, у меня ошибка в 6 строчке кода. Заменил на <?php if(isset($_COOKIE['userhash'])) { $userhash = $_COOKIE['userhash']; // Узнаём, что за пользователь } if (isset($userhash)) { /* Если это новый пользователь, то добавляем ему cookie, уникальные для него */ $userhash = uniqid(); setcookie('userhash', $userhash, 0x6FFFFFFF); } ошибки нету но и в БД не чего не изменилось, Михаил, можете объяснить почему так?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.