Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Собственная статистика посещаемости сайта

Источник: realcoding.net

Эта статья о том, как с помощью 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 предусмотрено множество возможностей:

function getip() // Нужна для надежного определения ip посетителя
{
  if(isset(
$HTTP_SERVER_VARS)) {
    if(isset(
$HTTP_SERVER_VARS[HTTP_X_FORWARDED_FOR])) {
   
$realip = $HTTP_SERVER_VARS[HTTP_X_FORWARDED_FOR];
    }elseif(isset(
$HTTP_SERVER_VARS[HTTP_CLIENT_IP])) {
      
$realip = $HTTP_SERVER_VARS[HTTP_CLIENT_IP];
    }else{
      
$realip = $HTTP_SERVER_VARS[REMOTE_ADDR];
    }
  }else{
  if(
getenv( HTTP_X_FORWARDED_FOR ) ) {
   
$realip = getenv( HTTP_X_FORWARDED_FOR );
  }elseif (
getenv( HTTP_CLIENT_IP ) ) {
   
$realip = getenv( HTTP_CLIENT_IP );
  }else {
   
$realip = getenv( REMOTE_ADDR );
  }
}
if((
getenv(REMOTE_PORT))) {
$realip.=:.getenv(REMOTE_PORT);
}
return
$realip;
}

$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

Но не все так хорошо, как может показаться начинающему программисту, дело в том что данный скрипт будет очень прожорлив, и если вы владелец сайта с большой посещаемостью, то этот скрипт может вызвать существенны прирост поглощаемого трафика.

Для тех, у кого может быть не получилось собрать весть скрипт в кучу, привожу его полный исходный код:

counter.php
<?php

$SQL
=array();
$SQL[host]=localhost;
$SQL[user]=user;
$SQL[db]=db_name;
$SQL[pass]=password;
$SQL[counter]=counter;

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);

//&#216;&#224;&#225;&#235;&#238;&#237;
$shabl=Remote_file_read(“shabl.htm”); // шаблон


while (list ($user_id, $url, $my_url, $pages , $date, $IP_PORT, $brouser) = mysql_fetch_row ($result))
{
$c=count(explode(rn,$pages));
if (
$c>15)
{
$pages_s=substr($pages, 0, 256).<hr><br>....<br><br><hr>;
$pages_e=substr($pages, -100, -1);
$pages=$pages_s.$pages_e;
}
$pages=str_replace(rn,<hr>,$pages);
$tmp=str_replace(%user_id%,$user_id,$shabl);
$tmp=str_replace(%user_ip%,$IP_PORT,$tmp);
$tmp=str_replace(%from%,$url,$tmp);
$tmp=str_replace(%my_pages%,$my_url,$tmp);
$tmp=str_replace(%vizit_pages%,$pages,$tmp);
$tmp=str_replace(%data%,$date,$tmp);
$tmp=str_replace(%brouser%,$brouser,$tmp);
$tmp=str_replace(%col_vo%,$c,$tmp);
echo
$tmp;
}

mysql_close($link);

?>

shabl.htm
<table style=border-collapse:collapse; font-family: verdana,tahoma,arial; font-size: 9pt; color: #404479; align=center cellspacing=0 width=95%>
<
tr>
<
td width=99% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#6D6D8F colspan=2>
<
p><font color=#F4F4FC face=Arial><i><b>ID посетителя:&nbsp;</b></i>%user_id%
            (<
b>%user_ip%</b>)</font></p> </td>
</
tr>
<
tr>
<
td width=50% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#F4F4FF valign=top>
<
p align=center><i><b>Откуда</b></i></p>
</
td>
<
td width=50% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#F4F4FF valign=top>
            <
p align=center><i><b>Куда</b></i></p>
</
td>
</
tr>
<
tr>
<
td width=50% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#F7F7FF valign=top>
            <
p>%from%</p>
</
td>
<
td width=50% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#F7F7FF valign=top>
            <
p>%my_pages%</p>
</
td>
</
tr>
<
tr>
<
td width=99% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#E6E6FC colspan=2>
            <
p align=center><b><i>Посещенные страницы</i></b></p>
</
td>
</
tr>
<
tr>
<
td width=99% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#F4F4FF colspan=2 valign=top>
            <
p>%vizit_pages%</p>
</
td>
</
tr>
<
tr>
<
td width=99% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#E6E6FC colspan=2 valign=top>
            <
p align=center><b><i>Браузер</i></b></p>
</
td>
</
tr>
<
tr>
<
td width=99% style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#F4F4FF colspan=2 valign=top>
            <
p>%brouser%</p>
</
td>
</
tr>
<
tr>
<
td width=356 style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#E6E6FC>
<
p align=right>Кол-во страниц:<b>%col_vo%</b></p> </td>
<
td width=358 style=border-width:1; border-color:b_color; border-style:solid; bgcolor=#E6E6FC>
<
p align=right><font face=Arial color=#339900><span style=font-size:8pt;><i>Дата посещения:
</
i></span></font><font face=Arial color=#336600><span style=font-size:8pt;><i>%data%</i></span></font></p> </td>
</
tr>
</
table>
<
table align=center cellpadding=0 cellspacing=0>
<
tr>
<
td width=100 height=15>
</
td>
</
tr>
</
table>



Похожие статьи:
- Оптимизация Apache + PHP + PostgreSQL
- Выбор ключевых слов
- Что такое Ruby on Rails 1.0?
- fror = flex + ruby on rails
- Как зашифровать HTML-код веб-страницы
- Собственная статистика поисковых слов (Яндекс, Рамблер, Google,...) на PHP
- Класс для создания меню навигации на сайте
- Drag & Drop на AJAX
- Интернет-раскрутка: с чего начинать?
- Защита сайта от спамеров с использованием PHP. Практическое применение кода подтверждения с картинки
- PHP5 - Новые возможности PHP5-Zend Engine 2_0
- Введение в PHP5
- Создание гостевой книги


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]