PHP 4 на практике


Проект: журнал посещений сайта


Статистические сведения о посетителях сайта приносят немалую пользу. Как вы уже знаете, сохранение информации о посетителях широко практикуется на сайтах рекламных web-агентств и порталов, а также на многих других сайтах, желающих получить дополнительные сведения о своих посетителях. Хотя системы учета бывают невероятно сложными, даже относительно простая система ведения учета открывает немало интересных возможностей. Я покажу, как реализовать простейший журнал посещений на базе РНР, MySQL и cookie.

В проекте использована методика идентификации браузера, описанная в главе 8. Если вы пропустили главу 8 или описание проекта, я настоятельно рекомендую вернуться и просмотреть код проекта.

Как было сказано ранее, наша система будет относительно простой — посещения будут отслеживаться только для индексной страницы сайта. При появлении нового посетителя сценарий РНР проверяет, существует ли на компьютере посетителя cookie. Если cookie находится, значит, пользователь посещал сайт в течение определенного интервала времени (который задается администратором сайта в инициализационном файле), и сценарий не учитывает новое посещение. Если cookie отсутствует или интервал между посещениями превысил заданную величину, информация сохраняется в таблице MySQL, а на компьютер посетителя создается cookie.

Как реализовать подобный сценарий на РНР? Прежде всего необходимо создать таблицу MySQL для хранения информации:

mysql>create table visitors (

->browser char(85) NOT NULL. ->ip char(30) NOT NULL.

->host char(85) NOT NULL.

->timeOfVisit datetime NOT NULL

->);

В поле browser хранится информация, непосредственно относящаяся к браузеру посетителя. Она берется из переменной РНР с именем $HTTP_USER_AGENT. В поле ip хранится IP-адрес посетителя. В поле host хранится информация о провайдере, от которого поступил IP-адрес. Наконец, поле timeOfVisit содержит дату и время посещения сайта.

Полноценное приложение для ведения журнала посещений имеется на сайте ресурсов РНР phpinfo.net (http://www.phpinfo.net). Более того, вы сможете непосредственно


на сайте увидеть, как оно работает. К сожалению, перед посещением этого сайта вам



придется вспомнить школьный курс французского языка.

Затем мы создаем инициализационный файл приложения init.inc (листинг 13.9), содержащий определения глобальных переменных и основных функций. Обратите внимание: в функции viewStats( ) используется сценарий sniffer.php из главы 8. Этот сценарий включается в файл init.inc по мере необходимости. Рекомендую потратить немного времени на просмотр этого сценария и комментариев к нему.

Листинг 13.9.

Инициализационный файл приложения (init.inc) <?

// Файл: init.inc

// Назначение: инициализационный файл журнала посещений сайта

// Параметры соединения с сервером MySQL $host = "localhost";

$user = "root"; $pswd = "";

// Имя базы данных Sdatabase = "myTracker";

// Имя таблицы $visitors_table = "visitors":

@mysql_pconnect($host, $user, $pswd) or die("Couldn't connect to MySQL server!");

// Выбрать базу данных

@mysql_select_db($database) or die("Couldn't select $database database!");

// Максимальное количество посещений, отображаемое в таблице $maxNumVisitors = "5";

// Имя cookie

$cookieName = "visitorlog";

// Значение cookie $cookieValue="1";

// Срок, который должен пройти с момента последнего посещения сайта,

// чтобы информация о текущем посещении была сохранена в базе данных.

// Если переменная $timeLimit равна 0. сохраняются все посещения

// независимо от их частоты.

// Остальные целочисленные значения интерпретируются как интервал

// времени в секундах.

$timeLimit = 3600:

// Формат отображения данных в браузере

$header_color = "#cbda74";

$table_color = "#000080";

$row_color = "IcOcOcO";

$font_color = "#000000":

$font_face = "Arial. Times New Roman. Verdana";

$font_size = "-1";

function recordUser() {

GLOBAL $visitors_table, $HTTP_USER_AGENT, $REMOTE_AODR, $REMOTE_HOST; if ($REMOTE_HOST — "") :



$REMOTE_HOST - "localhost"; endif;

$timestamp - date("Y-m-d H:i:S");

$query - "INSERT INTO $visitors_table VALUES('$HTTP_USER_AGENT', '$REMOTE_ADDR', '$REMOTE_HOST', '$timestamp')";

Sresult = @mysql_query($query); }

// recordUser function viewStats() {

GLOBAL $visitors_table, $maxNumVisitors, $table_color, $header_color;

GLOBAL $row color. $font color, $font face, $font size:

$query = " SELECT browser, ip. host. TimeofVisit FROM $visitors_table ORDER BY TimeofVisit desc LIMIT 0, $maxNumVisitors";

$result = mysql_query($query);

print "<table cellpadding=\"2\" cellspacing=\"1\" width = \"700\" border = \"0\" bgcolor=\ " $table_color\ ">";

print "<tr bgcolor= \"$header_color\"><th>Browser</th><th>IP</th><th>Host</ th><th>TimeofVisit</th></tr>";

while($row = mysql_fetch_array($result));

list ($browse_type, $browse_version) = browser_info ($row["browser"]); $op_sys = opsys_info ($row["browser"]);

print "<tr bgcolor=\"$row_color\">";

print "<td><font color=\"$font_color\" face=\"$font_face\" size=\"$font_size\">$browse_type $browse_version = $op_sys</font></td>";

print "<td><font color=\"$font_color\" face=\"$font_face\" si ze=\"$font_size\">".$row["ip"]."</f ont></td>";

print "<td><font color=\"$font_color\" face=\"$font_face\" size=\"$font_size\">".$row["host"]."</font></td>";

print "<td><font color=\"$font_color\" face=\"$font_face\" size=\"$font_size\">";

print $row["TimeofVisit"]."</font></td>";

print "</tr>";



endwhile;

print "</table>"; }

// viewStats

?>

Фрагмент кода, приведенный в листинге 13.10, проверяет существование cookie и при необходимости вызывает функцию recordUser( ). Я привожу этот фрагмент в составе очень простого индексного файла index.php.

Листинг 13.10.

Проверка существования cookie (index.php)

<?

include("Listing13-9.php"); if (! isset($$cookieName)) :

// Создать cookie

setcookie($cookieName, $cookieValue, time()+$timeLimit);

// Сохранить информацию о посетителе recordUser();

endif:

?>

<html>

<head>

<title>Wecome to My Site!</title>

</head>

<body bgcolor="#c0c0c0" text="#000000" link="#808040" " vlink="#808040" alink="#808040">

Welcome to my site. <a href = "visitors.php">Check out who else has recently visited</a>.

</body>

</html>

Как организовать просмотр информации, хранящейся в базе данных MySQL, в браузере? Задача решается простым вызовом функции viewStats( ) в отдельном файле visitors.php:

<html>

<?

include("sniffer.inc"):

include("init.inc");

?>

<head>

<title>Most recent <?=$maxNumVisitors:?> visitors</title>

</head>

<body bgcolor="#ffffff" text="#000000" link="#808040" vlink="#808040" alink="#808040">

viewStats( );

?>

</body>

</html>

Возможно и другое решение — включить весь код HTML в функцию viewStats( ), а затем просто включить sniffer.inc, init.inc и вызов viewStats( ) в отдельный файл. Выбор зависит от того, до какой степени вы хотите интегрировать форматирование таблицы с процессом выборки данных.

На рис. 13.1 показан пример выходных данных viewStats( ) для атрибутов форматирования, заданных в файле init.inc.



Рис. 13.1.

Пример результата, сгенерированного функцией viewStats( )

Существует немало путей для расширения практических возможностей этого приложения. Например, для отслеживания посещений со страницами сайта часто связываются идентификаторы, по которым в дальнейшем можно следить за перемещением пользователей между страницами. В рассмотренном проекте для этого в таблицу MySQL следует включить дополнительное поле, в котором хранится идентификатор страницы, а затем переопределить функцию recordllser( ) с дополнительным параметром. Идентификатор страницы сохраняется в cookie. При поступлении очередного запроса сценарий проверяет существование cookie для конкретной страницы, информация о которой регистрируется в журнале.


Содержание раздела