www.kaminskiy-web.com | contact@kaminskiy-web.com
Статьи для веб-мастера - Kaminskiy-web

Главная страницаОбо мнеКонтактная информация
Статьи HTML и CSS JavaScript PHP и MySQL Раскрутка сайтов Хостинг Рейтинг украинского хостинга Анекдоты Анекдотов стрит

Пишем графический счетчик посещений

Автор статьи: Сергей Каминский

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

С помощью счетчика мы узнаем IP-адрес посетителя, какие страницы сайта он посетил и откуда пришел, дату посещения каждой страницы и разрешение экрана посетителя. Также мы узнаем, какой браузер использует посетитель, включены ли у него cookie и Java (не путать с JavaScript).

Собираем данные и передаем статистику счетчику

Определять IP-адрес посетителя и дату посещения мы будем с помощью PHP, а все остальное при помощи JavaScript. Давайте напишем код, который будем ставить на страницах нашего сайта и с помощью которого мы будем узнавать необходимую информацию о посетителе. Для начала мы узнаем, включены ли в браузере посетителя cookie. Для этого необходимо передать cookie браузеру и узнать результат – получил он cookie или нет. Это значение мы сохраним в переменной cookie_detect:

<script language="javascript"><!--
cookie_detect="";
document.cookie="kamsoft=1; path=/"; cookie_detect+="c="+
(document.cookie?"Да":"Нет");
//--></script>

В результате переменной cookie_detect будет присвоена строка c=Да, если в браузере включены cookie или c=Нет, если отключены. Теперь будем определять все остальное и сразу передавать полученные данные скрипту, который будет обрабатывать информацию и сохранять ее в базе данных:

<script language="JavaScript"><!--
document.write('<img src="counter.php?'+cookie_detect+'&r='+
escape(top.document.referrer)+((typeof(screen)=='undefined')?'':
'&screen='+screen.width+'x'+screen.height+'x'+(screen.colorDepth?
screen.colorDepth:screen.pixelDepth))+ '&je='+navigator.javaEnabled()+'&na='+ 
navigator.appName + navigator.appVersion+'&p='+ window.location.pathname +
'&rand='+Math.random()+
' " alt="описание_картинки" '+
' border="0" width="88" height="31" />');
//--></script>

JavaScript функция Math.random() применяется здесь для генерации, при каждой загрузке страницы, нового случайного числа в адресе счетчика. Делается это для того, чтобы браузер обращался каждый раз к серверу, а не брал данные из кэша, и мы могли получать наиболее точную статистику. Если вам здесь что-то не понятно, то прочитайте статью "Как передать переменную из JavaScript в PHP", а также изучите руководство по JavaScript.

Не забывайте о посетителях, у которых отключен JavaScript. Без JavaScript мы сможем узнать только IP-адрес посетителя:

<noscript>
<img src="counter.php" width="88" height="31" />
</noscript>

Серверная часть

Всю информацию о посетителях будем хранить в базе данных. Мы будем использовать MySQL, как самую распространенную. Теперь нужно создать базу данных и таблицы для хранения собранной информации. Создаем файл установки install.php и пишем туда следующее:

<?php 

include('config.inc.php');

$result2 = mysql_query("create table countall (countall char(255) null); ");
$result3 = mysql_query("insert into countall values ('0')");
$result = mysql_query("create table kscount 
    (usip char(30) null, cookie char(10) null, 
    referer text null, screen char(30) null, 
    java char(10) null, browser char(255) null, 
    page char(255) null, date date null); ");

if ($result AND $result2 AND $result3) echo 'установка успешно завершена';
else echo 'не могу завершить установку';

?>

В этих таблицах мы будем сохранять все полученные данные. Создадим файл config.inc.php и занесем туда логин, пароль, сервер и имя базы данных:

<?php

define('DB_HOST', 'localhost'); // сервер БД
define('DB_USER', 'login'); // логин БД
define('DB_PASS', 'password'); // пароль БД
define('DB_NAME', 'database'); // имя БД

if (!$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS)) {
    echo 'не могу подключиться к серверу БД';
     exit();
}
if (!mysql_select_db(DB_NAME)) {
    echo 'не могу подключить БД';
     exit();
}

?>

Если вы просто копируете код с этой статьи, то обратите особое внимание на config.inc.php. В самом начале этого файла перед <?php и в конце, после ?> не должно быть пробелов – они могут скопироваться в файл при выделении кода. Наличие каких либо символов в указанных местах может нарушить работу счетчика. То же самое относится и к файлу counter.php. Также не забудьте поменять логин и пароль к базе данных на свои.

Запускаем сервер и набираем в адресной строке браузера путь к файлу установки:

http://localhost/counter/install.php

Если вы все сделали правильно, то увидите сообщение: «установка успешно завершена». Теперь напишем counter.php, который будет сохранять все полученные данные и генерировать картинку счетчика:

<?php

// запрещаем вывод предупреждений
Error_Reporting(E_ALL & ~E_NOTICE);

include('config.inc.php');

if (!extension_loaded("gd")) {
    echo 'не загружен модуль GD';
     exit;
} 

// определяем ip-адрес и дату
$ip = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : false;
$date = date("Y-m-d");

// перед добавлением информации в БД нужно применить addslashes()
$cookie = addslashes($today_hosts);
$referer = addslashes($r);
$screen = addslashes($screen);
$java = addslashes($je);
$browser = addslashes($na);
$page = addslashes($p);

$result = mysql_query("insert into kscount values ('".$ip."', '".$cookie."', 
                '".$referer."', '".$screen."', '".$java."', '".$browser."', 
                '".$page."', '".$date."')");

// хиты (просмотры страниц) за все время
$result3 = mysql_query("update countall set countall = countall + 1");
$result2 = mysql_query("select countall from countall");
$num_results2 = mysql_num_rows($result2);
for ($i = 0; $i<$num_results2; $i++) {
    $row = mysql_fetch_array($result2);
    $all_hits = htmlspecialchars(stripslashes($row["countall"]));
}

// хиты за сегодня
$result4 = mysql_query("select * from kscount where date='$date'");
$today_hits = mysql_num_rows($result4);

// хосты (посетители) за сегодня
$result5 = mysql_query("select distinct usip from kscount where date='$date'");
$today_hosts = mysql_num_rows($result5);

// если число будет длиннее 15 цифр или неизвестно, то выведем знак ?
// всего хитов
if (strlen($all_hits)>15||!isset($all_hits)) $all_hits = "?";
// хиты за сегодня
if (strlen($today_hits)>15||!isset($today_hits)) $today_hits = "?";
// хосты за сегодня
if (strlen($today_hosts)>15||!isset($today_hosts)) $today_hosts = "?";

// создаем картинку и запрещаем кэширование, чтобы картинка 
// не сохранялась в кэше браузера, а обновлялась при каждой загрузке
    header("Expires: Mon, 25 Jul 2005 10:00:00 GMT");
    header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Content-type: image/gif\n\n");
$image = ImageCreateFromGIF("./counter.gif");

// выбираем цвет для текста счетчика
// синий цвет для хитов и хостов за сегодня
$color = ImageColorAllocate($image, 0,0,255);

// белый цвет для хитов за все время
$color2 = ImageColorAllocate($image,255,255,255);
ImageString($image,1,2,2,"$all_hits",$color2);
ImageString($image,1,2,13,"$today_hits",$color);
ImageString($image,1,2,21,"$today_hosts",$color);
ImageGIF($image);
imagedestroy($image);

?>

Для генерации картинки используется PHP-библиотека GD2. Рисуем в графическом редакторе картинку размером 88х31 пикселей и сохраняем ее в формате gif с именем counter.gif. Открываем страницу сайта, на которой установлен код счетчика и любуемся результатом.

Графический счетчик посещений
Так выглядит наш графический счетчик посещений

В самой верхней части счетчика отображается общее количество хитов за все время, посередине хиты за сегодня, а в самом низу хосты за сегодня.

Интерфейс администрирования

Теперь напишем admin.php, с помощью которого мы будем просматривать полученные данные и удалять старые ненужные записи:

<?php

Error_Reporting(E_ALL & ~E_NOTICE);

include('config.inc.php');

// удаляем данные за выбранный день при нажатии на ссылке "удалить"
if (isset($delete)) {
    $delete = addslashes($delete);
    $del = mysql_query("delete from kscount WHERE date='$delete'");
}
if ($del) {
    echo '<span style="color: #FF0000">Статистика за день ' . 
    stripslashes($delete);
    echo ' удалена</span><br /><br />';

// Если ничего не выбрано, то выводим статистику по cookie за сегодня
if (!isset($take)) $take = 'cookie';

// Если не выбрана дата, то ставим сегодняшнюю
if (!$date) $date = date("Y-m-d");

// выводим все даты на экран
$result = mysql_query("SELECT distinct date FROM kscount");
$num_results = mysql_num_rows($result);

// выводим навигацию по статистике
for ($i = 0; $i < $num_results; $i++) {
    $row = mysql_fetch_array($result);
    echo htmlspecialchars(stripslashes($row["date"]));
    echo ' - <a href=admin.php?delete=' . 
    htmlspecialchars(stripslashes($row["date"]));
    echo '>удалить</a><br />';
    echo '<a href=admin.php?take=cookie&date=' . 
    htmlspecialchars(stripslashes($row["date"]));
    echo '>Cookie</a> | ';
    echo '<a href=admin.php?take=referer&date=' . 
    htmlspecialchars(stripslashes($row["date"]));
    echo '>Referer</a> | ';
    echo '<a href=admin.php?take=screen&date=' . 
    htmlspecialchars(stripslashes($row["date"]));
    echo '>Разрешение экрана</a> | ';
    echo '<a href=admin.php?take=java&date=' . 
    htmlspecialchars(stripslashes($row["date"]));
    echo '>Java</a> | ';
    echo '<a href=admin.php?take=browser&date=' . 
    htmlspecialchars(stripslashes($row["date"]));
    echo '>Браузер и ОС</a> | ';
    echo '<a href=admin.php?take=page&date=' . 
    htmlspecialchars(stripslashes($row["date"]));
    echo '>Страницы</a><br /><br />';
}

// выводим выбранную статистику
echo 'Статистика за день: <strong>' . $date . '</strong><br /><br />';

echo '<strong>';
if ($take=='cookie') echo 'Cookie:';
elseif ($take=='referer') echo 'Referer:';
elseif ($take=='screen') echo 'Разрешение экрана:';
elseif ($take=='java') echo 'Поддержка Java:';
elseif ($take=='browser') echo 'Браузер и ОС:';
elseif ($take=='page') echo 'Страницы:';
echo '</strong><br />';

$result2 = mysql_query("SELECT $take, COUNT(distinct usip) FROM kscount 
       WHERE date='$date' GROUP BY $take;");

$num_results2 = mysql_num_rows($result2);
for ($i = 0; $i<$num_results2; $i++) {
    $row = mysql_fetch_array($result2);

    if ($take=='browser') {
        // Определяем браузер (можете добавить свои)
        if (stristr($row["$take"], 'Opera9.10')) {
            echo 'Браузер Opera';
        }
        elseif (stristr($row["$take"], 'MSIE 6.0')) {
            echo 'Браузер Internet Explorer 6.0';
        }
        elseif (stristr($row["$take"], 'Netscape5.0')) {
            echo 'Браузер Mozilla Firefox 2.0';
        }

        // если браузер неизвестен, то выведем всю строку из базы данных
        // изучив строку вы сможете определить браузер и 
        // добавить его в список выше
        else echo htmlspecialchars(stripslashes($row["$take"]));

        // Определяем операционную систему
        if (stristr($row["$take"], 'Windows NT 5.1')) echo ' с ОС Windows XP';
        elseif (stristr($row["$take"], 'linux')) echo ' с ОС Linux';
    }

    // если ОС неизвестена, то также выведем всю строку из базы данных
    // определим по ней ОС и добавим в список выше
    else echo htmlspecialchars(stripslashes($row["$take"]));

    // выводим количество посетителей
    printf("&nbsp; &nbsp; %d посетителей.\n", $row[1]);
    echo '<br />';
}

?>

Интерфейс администрирования
Интерфейс администрирования – просмотр статистики посещения сайта

Вы можете расширить возможности счетчика посещений. Например по referer можно узнать с какого поисковика пришел посетитель и что он вводил в строке поиска чтобы найти ваш сайт.

Как видите, ничего сложного в этом нет. Если вы знакомы с PHP и MySQL, то прочитав эту статью, легко сможете написать свой SpyLog.

Другие записи по теме в разделе статьи по PHP и MySQL

Копирование статьи запрещено.