Статистика на сайті. Пишемо скрипт лічильника відвідувань.
Вступ
Напевно, багато хто з вас відвідуючи різні сайти, звертають увагу на лічильники, які стоять на сайтах. Статистика показує нам скільки чоловік відвідали ресурс, скільки сторінок був відвантажено, скільки людей перебувають на сайті в поточний момент і тд. Все це є дуже корисним інструментом, тому що як дозволяє дізнатися власнику сайту, затребуваність і рейтинг його ресурсу. Чим цікавіше і корисніше ресурс, тим більше у нього відвідувань.
На даний момент існує величезна кількість сервісів, які пропонують нам багато інструментів для збору статистики і даних, а також їх аналізу. Всі вони дуже професійно виконують свої завдання, але все колись починалося з самописного лічильника, які можна зустріти і зараз.
Якщо ви хочете зрозуміти як відбувається облік користувачів, я підготував урок, в якому я напишу лічильник відвідувань сайту, поясню як встановити лічильник на сайт і використовувати дані в своїх цілях.
деталі
Для того щоб нам написати простенький лічильник нам доведеться дізнатися декілька нових функцій.
* Робота з файлами (створення / читання / запис); * Робота з сесіями; * Робота з функціями для створення зображення; * Підключення лічильника;
Збережемо цю сторінку в папці www і перейдемо до програмування лічильника.
counter.php
Щоб зберігати отримані дані, нам необхідно їх кудись записувати, нехай для початку це буде простий текстовий файл з ім'ям stat.txt.
‹?php $url = "counter/stat.txt";
Змінної $ url присвоєно адресу до файлу. Це є, єдиний конфігураційний елемент, в якому ми задаємо потрібні дані, далі скрипт складається з логічних виразів else if і функцій роботи з файлами
Цей фрагмент коду відповідає за перевірку на наявність файлу, весь хід логічних дій я прописав в коментарях.
if(!file_exists($url)) { //Проверка на существование файла. //Если файла не существует, $count = 0; $handle = fopen($url,"a");//создаем его, fwrite($handle,$count);// и записываем нулевое значение fclose($handle);//Закрываем файл }
Далі опишемо умова, коли файл створений.
else { //Если файл существует, то работаем с ним $handle = fopen($url,"a+"); //Открываем его $count = fread($handle,filesize($url)); //Читаем данные и присваеваем их переменной $count fclose($handle); //Закрываем $count++;//Добавляем одно посещение к полученному выше $handle = fopen($url,"w"); // Открываем файл, и урезаем его до нулевой длины fwrite($handle,$count); //Записываем переменную $count fclose($handle); //Закрываем }
У цьому фрагменті якраз описаний скрипт лічильника відвідувань, уважно дивіться, в першому фрагменті ми відкриваємо файл для того щоб його відкрити і дізнатися кількість відвідувань. Далі ми збільшуємо отримане значення на 1 одиницю ($ count ++;) і записуємо це значення в наш файл.
В кінці файлу ми виводимо статистику за допомогою оператора echo
echo "количество просмотров: $count ";
Ми розглянули найпростіший тип лічильника, але повірте, іноді складніше і не потрібно, наприклад нам необхідно дізнатися кількість прочитань сторінки (статті, оголошення) всередині сайту. Зазвичай це вказує відвідувачам сайту найбільш цікавий матеріал. Далі щоб цей лічильник заробив, відкриваємо наш файл index.php, і додаємо рядок до тега
* Легко накручується простим оновленням сторінки (F5). * Якщо кілька людей одночасно звернуться до скрипту, виникне ошібка.Т.к. файл відкритий і використовується ким то іншим, тому необхідно доповнити скрипт. * Якщо буде видалений файл з даними, то ви втратите накопичену статистику
Варіант 2
Лічильник враховує тільки відвідувачів. Що це означає? Відвідувачі - це кількість користувачів, які відвідали ваш ресурс, наприклад за добу, причому якщо навіть людина буде оновлювати сторінку значення відвідувань додаватися не буде.
Щоб створити такий лічильник, нам необхідно навчитися працювати з сесіями. В чому сенс? Якщо людина відвідує ваш сайт вперше, то створюється сесія, яка працює до тих пір, поки людина не закрив браузер, тобто при наступних перезагрузках сторінки (F5) або переходах по сайту, ми будемо перевіряти чи створена сесія. Якщо сесія існує, то враховувати користувача не будемо.
Даний варіант є трохи удосконаленим в порівнянні з першим варіантом.
Зверніть увагу на початок файлу, функція session_start () ініціалізує сесію.
counter.php
У цьому фрагменті в порівнянні з першим залишаємо все без змін
<? Php
$ Url = "counter / stat.txt";
if (! file_exists ($ url)) {
// Якщо файлу не існує, створюємо його, і записуємо нульове значення
$ Count = 0;
$ Handle = fopen ($ url, "a");
fwrite ($ handle, $ count);
fclose ($ handle);
}
Тут теж, тільки читаємо файл, і отримуємо кількість посещеній.Далее дивіться уважніше
else {
// Якщо файл існує, то працюємо з ним
$ Handle = fopen ($ url, "a +"); // Відкриваємо його
$ Count = fread ($ handle, filesize ($ url)); // Читаємо дані і прісваеваемого їх змінної $ count
fclose ($ handle);
Створюємо умова, якщо сесія відсутній, то це значить людина відвідує сторінку в перший раз, тому змінної $ _SESSION [ 'count'] присвоюємо яке те значення, яке перевіряється на початку умови, далі до змінної $ count додаємо одиницю, і записуємо її назад в файл, причому для початку замикаємо доступ до нього, виробляємо запис і відкриваємо доступ.Ето потрібно для того щоб в момент звернення кількох відвідувачів до скрипту не виникало помилок.
Тепер я обьясню, чому при натисканні F5 не додається жодного посещеніе.Так як при першому відвідуванні ми створюємо сесію, то в результаті перевірки if (! Isset ($ _ SESSION [ 'count']) вираз поверне значення FALSE, отже нічого додавати і записувати не будемо .
[+] Плюси:
* Простота установки * Не вимагає БД * Не накручується оновленням сторінки * При зверненні скрипта кількох людей одночасно, не виникає помилки.
[-] Мінуси даного лічильника:
* Якщо буде видалений файл з даними, то ви втратите накопичену статистику
бонус
В цьому варіанті ми розглянемо скрипт, який буде будувати графічну картинку, на якій буде відображатися кількість відвідувачів. Для цього нам потрібна підкладка для нашого лічильника, це повинно бути зображення формату jpeg, для тестування можете взяти цю.
Далі нам необхідно доопрацювати другий варіант, і додати ще один файл, який буде відповідати за побудову картинки.
counter.php - Тут знаходитися набір функцій по роботі з зображеннями
<? Php
// Підкладка для лічильника
$ Im = ImageCreateFromJpeg ( "bg.jpg");
// Колір тексту
$ Black = imagecolorallocate ($ im, 255,255,255);
// Отрісовка тексту
imagestring ($ im, 1,8,4, $ _ GET [ 's'], $ black);
Header ( "Content-type: image / jpeg");
// Висновок зображення
ImageJpeg ($ im);
// Руйнуємо зображення, щоб не засмічується пам'ять
imagedestroy ($ im);
?>
Всі ці три варіанти обов'язково стануть в нагоді в майбутньому.
[+] Плюси:
* Простота установки * Не вимагає БД * Не накручується оновленням сторінки * При зверненні скрипта кількох людей одночасно, не виникає помилки. * Гарний, настроюється зовнішній вигляд.
[-] Мінуси даного лічильника:
* Якщо буде видалений файл з даними stat.txt, то ви втратите накопичену статистику
висновок
Всі описані варіанти можна з легкістю застосовувати на практиці, для того щоб вивести лічильник просто помістіть код <? Php @include (counter.php);?> В потрібне місце
UPGRADE Лічильника - Графічний лічильник хітів і відвідувань.
деталі
Для модифікування лічильника нам потрібно освоїти:
* Робота з функцією setcookie () і суперглобалом $ _COOKIE; * Масиви в PHP; * Функції побудови зображення в PHP; * Робота з файлами і бд MySQL.
Варіант 1.Счетчік на файлах
Весь лічильник буде складатися з декількох файлів:
* Index.php - сторінка на якій відбувається виклик лічильника * Counter.php - скрипт з логічними операціями і функціями читання / запису даних * Img.php - скрипт побудови зображення * Stat.txt - файл, що містить статистику
index.php
Стандартний файл містить html-код, і підключення скрипта лічильника
Також в цьому файлі в самому верху сторінки, до тегів і необхідно встановити cookie (куки).
Перший атрибут у функції несе ім'я cookie, другий атрибут - значення, яке присвоєно цього імені, тобто якщо виконати echo $ _COOKIE [ 'freshcoder'], браузер виведе слово count.Третій атрибут встановлює час дії cookie, тобто якщо людина зайшла в 10 ранку, нам необхідно встановити cookie на 14 годин. Час дії вказується в секундах.
Даний скрипт зазнав деяких змін. Як захист від накрутки використовується умова перевірки наявності cookie на стороні користувача.
Наприклад людина зайшла на сайт о 10 годині ранку, нам необхідно додати одне відвідування і залишити cookies в браузері цієї людини, які будуть діяти до 0.00 годин поточного дня.
Логіка скрипта проста, якщо немає куків у користувача, ми накручуємо лічильник на одиницю і пишемо значення в файл, інакше додаємо хіт.
<? Php
$ Url = "counter / stat.txt";
if (! file_exists ($ url)) {
// Якщо файлу не існує, створюємо його, і записуємо нульове значення
$ Count = "0 :: 0";
$ Handle = fopen ($ url, "a");
fwrite ($ handle, $ count);
fclose ($ handle);
}
else {
// Якщо файл існує, то працюємо з ним
$ Data = file ($ url); // Відкриваємо його
list ($ user, $ hit) = explode ( "::", $ data [0]); // Розбиваємо масив на змінні
if (! $ _ COOKIE [ 'freshcoder']) {$ user ++; $ hit ++;}
else {$ hit ++;}
$ Handle = fopen ($ url, "w"); // Відкриваємо файл
$ Count = $ user. "::". $ Hit; // Формуємо рядок
if (flock ($ handle, LOCK_EX)) {// замикати файл
fwrite ($ handle, $ count); // Записуємо її в файл
flock ($ handle, LOCK_UN); // Відмикаємо файл
} Else {
echo "Повторіть пізніше";
}
fclose ($ handle);
}
// Виводимо кількість переглядів.
echo '<img src = "img.php? u ='. $ user. '& h ='. $ hit. '" alt = "stat" width = "80" height = "30" border = "0" /> ';
?>
img.php
Даний скрипт зазнав значних змін. Оскільки функція imagestring (), при побудові написи за початок координат використовує верхній лівий кут, то з часом при збільшенні довжини рядка цифр у нас виникне проблема - частина їх буде вилазити за зображення. Для того щоб цього не відбувалося, напишемо прості умови, які отримують дані, порівнюють їх, і викликають функцію imagestring () із зміненими координатами.
Також в скрипті додаємо другий рядок для побудови напису. Даний скрипт отримує дані параметром GET, тому
витягувати дані будемо з суперглобала $ _GET.
img.php? u = '. $ user.' & h = '. $ hit.' »в
цьому рядку ми присвоїли змінній $ _GET [ 'u'] значення $ user, а $ _GET [ 'h'] - значення $ hit . Це дуже простий спосіб предачі параметрів скрипту. Але такий метод не рекомендується для передачі пароля або будь-яких важливих даних.
<? Php
// Підкладка для лічильника
$ Im = ImageCreateFromGif ( "bg.gif"); </ p>
// Колір тексту
$ Black = imagecolorallocate ($ im, 255,255,255);
// Малюємо колічство відвідувачів
if ($ _ GET [ 'u']> = 1 AND $ _GET [ 'u'] <10) {
imagestring ($ im, 2,69,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 10 AND $ _GET [ 'u'] <100) {
imagestring ($ im, 2,64,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 100 AND $ _GET [ 'u'] <1000) {
imagestring ($ im, 2,59,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 1000 AND $ _GET [ 'u'] <10000) {
imagestring ($ im, 2,54,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 10000 AND $ _GET [ 'u'] <100000) {
imagestring ($ im, 2,49,14, $ _ GET [ 'u'], $ black);
}
// Малюємо колічство хітів
if ($ _ GET [ 'h']> = 1 AND $ _GET [ 'h'] <10) {
imagestring ($ im, 2,69,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 10 AND $ _GET [ 'h'] <100) {
imagestring ($ im, 2,64,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 100 AND $ _GET [ 'h'] <1000) {
imagestring ($ im, 2,59,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 1000 AND $ _GET [ 'h'] <10000) {
imagestring ($ im, 2,54,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 10000 AND $ _GET [ 'h'] <100000) {
imagestring ($ im, 2,49,3, $ _ GET [ 'h'], $ black);
}
Header ( "Content-type: image / gif");
ImageGif ($ im);
imagedestroy ($ im);
?>
Ось і вийшов лічильник для обліку переходів по сторінках і вказує реальну кількість відвідувачів.
Варіант 2. Лічильник на MySQL
Для початку необхідно створити таблицю, в якій ми будемо зберігати всі дані. Якщо ви тестируете на локальному сервері, то запит буде наступний:
При роботі з базою даних зміниться тільки файл counter.php
counter.php
У цьому прикладі все набагато простіше. Першим кроком підключаємося до БД.
<? Php
// Підключаємося до БД.
$ Db = @ mysql_connect ( "localhost", "root", "pass") or die ( "Помилка підключення");
@mysql_select_db ( "test", $ db) or die ( "Не можу вибрати БД");
$ Q = mysql_query ( "SELECT * FROM counter");
$ R = mysql_fetch_array ($ q);
if (! $ _ COOKIE [ 'freshcoder'])
{
$ R [ 'hosts'] ++; $ R [ 'hits'] ++; // Якщо немає cookie додаємо значення
}
else {$ r [ 'hits'] ++; } // Якщо існують куки, то просто плюсуем хіти
mysql_query ( "UPDATE counter SET hosts = '". $ r [' hosts ']. "', hits = '". $ r [' hits ']. "'");
echo '<img src = "img.php? u ='. $ r [ 'hosts']. '& h ='. $ r [ 'hits']. '" alt = "stat" width = "80" height = "30" border = "0" /> ';
?>
За допомогою функції mysql_fetch_array отримуємо масив $ r, ключами якого є поля таблиці counter. Змінна $ r [ 'hosts'] - це відвідувачі, а $ r [ 'hits'] - це хіти. Так само як і при роботі з файлами використовуємо умови і перевірку cookie, якщо не існують, то змінну $ r [ 'hosts'] збільшуємо на одиницю, якщо існую то ми збільшуємо змінну $ r [ 'hits'].
Далі слід запит, який оновлює запис і вставляє значення. Після цього виводимо скрипт картинки.
img.php
Ми залишаємо без змін.
<? Php
// Підкладка для лічильника
$ Im = ImageCreateFromGif ( "bg.gif"); </ p>
// Колір тексту
$ Black = imagecolorallocate ($ im, 255,255,255);
// Малюємо колічство відвідувачів
if ($ _ GET [ 'u']> = 1 AND $ _GET [ 'u'] <10) {
imagestring ($ im, 2,69,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 10 AND $ _GET [ 'u'] <100) {
imagestring ($ im, 2,64,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 100 AND $ _GET [ 'u'] <1000) {
imagestring ($ im, 2,59,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 1000 AND $ _GET [ 'u'] <10000) {
imagestring ($ im, 2,54,14, $ _ GET [ 'u'], $ black);
}
if ($ _ GET [ 'u']> = 10000 AND $ _GET [ 'u'] <100000) {
imagestring ($ im, 2,49,14, $ _ GET [ 'u'], $ black);
}
// Малюємо колічство хітів
if ($ _ GET [ 'h']> = 1 AND $ _GET [ 'h'] <10) {
imagestring ($ im, 2,69,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 10 AND $ _GET [ 'h'] <100) {
imagestring ($ im, 2,64,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 100 AND $ _GET [ 'h'] <1000) {
imagestring ($ im, 2,59,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 1000 AND $ _GET [ 'h'] <10000) {
imagestring ($ im, 2,54,3, $ _ GET [ 'h'], $ black);
}
if ($ _ GET [ 'h']> = 10000 AND $ _GET [ 'h'] <100000) {
imagestring ($ im, 2,49,3, $ _ GET [ 'h'], $ black);
}
Header ( "Content-type: image / gif");
ImageGif ($ im);
imagedestroy ($ im);
?>
Сподобалося? Підпишись на RSS новини! Ви також можете підтримати shram.kiev.ua, тисніть:
Не зайвим буде і твоїм друзям дізнатися цю інформацію, поділися з ними статтею!
Розгорнути / згорнути
Коментарі
Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ.Всі коменти приховані з індексу, спам контролюється.
Коментарі
Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ. Всі коменти приховані з індексу, спам контролюється.