друзья
реклама
|
Для вебмастера » DLE - DataLife Engine → Пишем статистику для сайта на PHP
![]()
Многие виды статистики, достпные в интернете крайне не стабильны и обладают скучным функционалом. Мы напишем на PHP свой мониторинг, чтобы иметь все данные на руках. 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 пользователю } Итак, пользователя зарегистрировали. Теперь нужно достать нужные данные: какие страницы он посещал, его ip адрес и другие. Для это пишем следующий код:
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 [code]$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("Ъta%",$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>Ъta%</i></span></font></p> </td> </tr> </table> <table align=center cellpadding=0 cellspacing=0> <tr> <td width=100 height=15> </td> </tr> </table> Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем. Комментарии:Оставить комментарий |
популярное
календарь
опрос
счетчики
Реклама
|