Пишемо графічний лічильник відвідувань

  1. Збираємо дані і передаємо статистику лічильнику
  2. серверна частина
  3. інтерфейс адміністрування

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

Напевно немає такого сайту, на сторінках якого не встановлено лічильник відвідувань 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 ( "Ymd"); // перед додаванням інформації в БД потрібно застосувати 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 MYH: 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 ( "Ymd"); // виводимо всі дати на екран $ 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

Копіювання статті заборонено.

Cookie?
Write ( '<img src = "counter.php?' + Cookie_detect + '& r =' + escape (top.document.referrer) + ((typeof (screen) = = 'undefined')?
ColorDepth?
На самому початку цього файлу перед <?
Php і в кінці, після?
Isset ($ all_hits)) $ all_hits = "?