|
|
Эта статья о том, как с помощью 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("\r\n",$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."\r\n".$my_urls));
}
@mysql_free_result($result);
}
}
В
итоге нам остается добавить всего пару строк и скрипт будет готов:
IncCounter(); // Заполняем таблицу
@mysql_close($link);
//Разрываем связь с MySQL
Но не все так хорошо, как может
показаться начинающему программисту, дело в том что данный скрипт будет очень
прожорлив, и если вы владелец сайта с большой посещаемостью, то этот скрипт
может вызвать существенны прирост поглощаемого трафика.
Для тех,
у кого может быть не получилось собрать весть скрипт в кучу, привожу его полный
исходный код:
counter.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("\r\n",$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."\r\n".$my_urls));
}
@mysql_free_result($result);
}
}
IncCounter();
@mysql_close($link);
?>
Для
вывода статистики вам может понадобиться еще один
скрипт:
vizit_info.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");
//Øàáëîí
$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("\r\n",$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("\r\n","<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
посетителя: </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>
Если
у вас есть вопросы или дополнения, или вы просто с чем-то не согласны пишите мне
на [email protected] и заходите на мой сайт https://wm-help.net/