Эта статья о том, как с помощью PHP и MySQL можно организовать сбор статистики посещений вашего сайта. Причем особенностью полученной статистики в результате работы скрипта будет являться то, что вы получите статистику о каждом посетителе в отдельности, узнаете какие страницы он посещал, каким браузером пользовался, сколько провел времени на вашем сайте и многое другое.
Для начала вам нужно создать таблицу в своей базе данных (MySQL), назовем ее, к примеру “counter”, ее структура будет примерно такой:
CREATE TABLE `counter` ( `user_id` varchar(64) NOT NULL default , `url` text NOT NULL, `my_url` text NOT NULL, `pages` text NOT NULL, `date` datetime default NULL, `IP_PORT` varchar(30) NOT NULL default , `brouser` varchar(100) NOT NULL default , KEY `user_id` (`user_id`) ) TYPE=MyISAM;
После создания таблицы непосредственно переходим к написанию самого скрипта, отвечающего за заполнение и отображение собранной информации. Для начала нам нужно как бы «зарегистрировать» пользователя, для этого можно воспользоваться сессиями:
session_register(user); // открываем сессию user if (($_SESSION[user]==) or ($_SESSION[user]==0)) // Проверяем зарегистрирован пользователь или нет { $_SESSION[user]=rand(1,999999999); // Присваиваем id пользователю }
При использовании данного способа необходимо, что бы скрипт счетчика работал до вывода в браузер пользователя какой-либо информации, или данный кусок кода можно внести в начало главного скрипта, а счетчик include’ить в нужном вам месте.
Теперь пользователь зарегистрирован и нам осталось получить информацию о нем и о страницах которые он посещал. Для этого в PHP предусмотрено множество возможностей:
$brow = getenv(HTTP_USER_AGENT); // Полное имя браузера $ref = getenv(HTTP_REFERER); // Откуда пришел посетитель $my_urls = getenv(QUERY_STRING); // Где сейчас находится $ip=getip(); // Получаем ip
Информацию о пользователе получили, теперь ее нужно добавить в таблицу, для этого для начала нужно подключиться к базе и выбрать нашу таблицу:
$SQL=array(); // Создаем массив с основными параметрами для MySQL и заполняем его $SQL[host]=localhost; $SQL[user]=user; $SQL[db]=db_name; $SQL[pass]=password; $SQL[counter]=counter;
$link = mysql_connect($SQL[host], $SQL[user], $SQL[pass]) // Соединение с MySQL or die (Could not connect to MySQL);
mysql_select_db ($SQL[db]) // Выбор базы данных or die (Could not select database);
$result = mysql_query(SELECT * FROM `.$SQL[counter].`, $link); // теперь в $result содержится указатель на ответ MySQL $num_rows = mysql_num_rows($result); // получаем число строк в таблице
С MySQL соединились, теперь нужно заполнить таблицу данными, для этого создадим несколько новых функций:
function searchID($id) // Ищет id пользователя в таблице, по результату этой функции определяем, есть ли для данного пользователя уже созданное поле, или пользователь впервые на вашей странице. { global $SQL; $result = mysql_query (SELECT * FROM `.$SQL[counter].` WHERE `user_id` LIKE .$id.) or die (Query failed); $num_rows = mysql_num_rows($result); mysql_free_result($result); if ($num_rows>0) return True; else return False; }
function Update($id,$pages) // Если пользователь уже был на вашем сайте, то просто обновляем информацию о нем. { global $SQL; $c=count(explode(rn,$pages)); if ($c<150){ $result = mysql_query (UPDATE `.$SQL[counter].` SET `pages` = .$pages. WHERE `user_id` = .$id.) or die (Query failed); return $result; } }
function IncCounter() // Основная функция скрипта, обновляет или добавляет информацию о посетителе { $brow = getenv(HTTP_USER_AGENT); // Полное имя браузера $ref = getenv(HTTP_REFERER); // Откуда пришел посетитель $my_urls = getenv(QUERY_STRING); // Где сейчас находится $ip=getip(); // Получаем ip global $SQL; if (eregi(module=users,$my_urls)==false) { if (searchID($_SESSION[user])==false) { $result = mysql_query (INSERT INTO `counter` ( `user_id` , `url` , `my_url` , `pages` , `date` , `IP_PORT` , `brouser` ) VALUES (.$_SESSION[user]. , .$ref. , .$my_urls., .trim($my_urls). , NOW( ) , .$ip. , .$brow.);); } else { $result = mysql_query (SELECT * FROM `.$SQL[counter].` WHERE `user_id` LIKE .$_SESSION[user].) or die (Query failed); list ($user_id, $url, $my_url, $pages , $date, $IP_PORT, $brouser) = mysql_fetch_row ($result); Update($user_id,trim($pages.rn.$my_urls)); } @mysql_free_result($result); } }
В итоге нам остается добавить всего пару строк и скрипт будет готов:
IncCounter(); // Заполняем таблицу @mysql_close($link); //Разрываем связь с MySQL
Но не все так хорошо, как может показаться начинающему программисту, дело в том что данный скрипт будет очень прожорлив, и если вы владелец сайта с большой посещаемостью, то этот скрипт может вызвать существенны прирост поглощаемого трафика.
Для тех, у кого может быть не получилось собрать весть скрипт в кучу, привожу его полный исходный код:
session_register(user); // открываем сессию user if (($_SESSION[user]==) or ($_SESSION[user]==0)) { $_SESSION[user]=rand(1,999999999); }
$link = mysql_connect($SQL[host], $SQL[user], $SQL[pass]) or die (Could not connect to MySQL);
mysql_select_db ($SQL[db]) or die (Could not select database);
$result = mysql_query(SELECT * FROM `.$SQL[counter].`, $link); $num_rows = mysql_num_rows($result);
function searchID($id) { global $SQL; $result = mysql_query (SELECT * FROM `.$SQL[counter].` WHERE `user_id` LIKE .$id.) or die (Query failed); $num_rows = mysql_num_rows($result); mysql_free_result($result); if ($num_rows>0) return True; else return False; }
function Update($id,$pages) { global $SQL; $c=count(explode(rn,$pages)); if ($c<150){ $result = mysql_query (UPDATE `.$SQL[counter].` SET `pages` = .$pages. WHERE `user_id` = .$id.) or die (Query failed); return $result; } }
function IncCounter() { $brow = brow_type(true); $ref = getenv(HTTP_REFERER); $my_urls = getenv(QUERY_STRING); $ip=getip(); global $SQL; if (eregi(module=users,$my_urls)==false) { if (searchID($_SESSION[user])==false) { $result = mysql_query (INSERT INTO `counter` ( `user_id` , `url` , `my_url` , `pages` , `date` , `IP_PORT` , `brouser` ) VALUES (.$_SESSION[user]. , .$ref. , .$my_urls., .trim($my_urls). , NOW( ) , .$ip. , .$brow.);); } else { $result = mysql_query (SELECT * FROM `.$SQL[counter].` WHERE `user_id` LIKE .$_SESSION[user].) or die (Query failed); list ($user_id, $url, $my_url, $pages , $date, $IP_PORT, $brouser) = mysql_fetch_row ($result); Update($user_id,trim($pages.rn.$my_urls)); } @mysql_free_result($result); } }
IncCounter(); @mysql_close($link); ?>
Для вывода статистики вам может понадобиться еще один скрипт:
vizit_info.php
<?php $link = mysql_connect($SQL[host], $SQL[user], $SQL[pass]) or die (Could not connect to MySQL);
mysql_select_db ($SQL[db]) or die (Could not select database);
$result = mysql_query(SELECT * FROM `.$SQL[counter].`, $link); $num_rows = mysql_num_rows($result);
$result = mysql_query (SELECT * FROM .$SQL[counter]. ORDER BY `date` DESC LIMIT 0 , .$num_rows.) or die (Query failed);