UPGRADE. Статистика на сайте часть 2. Графический счетчик хитов и посещений.
Введение
Данный урок является дополнением к уроку №4. Цель этого апгрейда – сбор статистики на сайте, обзор хитов и посетителей. В предыдущей версии мы рассмотрели более простые варианты исполнения счетчиков, сегодня же мы займемся счетчиком, который не накручивается простой перезагрузкой страницы при нажатии f5 и перезагрузкой браузера.
Детали
Для модифицирования счетчика нам потребуется освоить:
- Работа с функцией setcookie() и суперглобалом $_COOKIE;
- Массивы в PHP;
- Функции построения изображения в PHP;
- Работа с файлами и бд MySQL.
Вариант 1.Счетчик на файлах
Весь счетчик будет состоять из нескольких файлов:
- index.php – страница на которой происходит вызов счетчика
- counter.php – скрипт с логическими операциями и функциями чтения/записи данных
- img.php – скрипт построения изображения
- stat.txt – файл, содержащий статистику
index.php
Стандартный файл содержащий html-код, и подключение скрипта счетчика <?php include(‘counter.php’);?> Также в этом файле в самом верху страницы, до тегов и необходимо установить cookie(куки).
Первый атрибут у функции несет имя cookie, второй атрибут – значение, которое присвоено этому имени, т.е. если выполнить echo $_COOKIE['freshcoder'] , браузер выведет слово count.Третий атрибут устанавливает время действия cookie, т.е. если человек зашел в 10 утра, нам необходимо установить cookie на 14 часов. Время действия указывается в секундах.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php setcookie("freshcoder","count",time()+(24-date('G'))*3600);?> <html> <head> <title>Пример работы счетчика</title> </head> <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"> <p>Добро пожаловать</p> <?php @include("counter.php");?> </body> </html> |
counter.php
Данный скрипт претерпел некоторые изменения. В качестве защиты от накрутки используется условие проверки наличия cookie на стороне пользователя.
Например человек зашел на сайт в 10 часов утра, нам необходимо добавить одно посещение и оставить cookies в браузере этого человека, которые будут действовать до 0.00 часов текущего дня.
Логика скрипта простая, если нет куков у пользователя, мы накручиваем счетчик на единицу и пишем значение в файл, иначе добавляем хит.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?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() с измененными координатами. Чтобы понять как это происходит, смотрите фрагмент кода:
В качестве подложки выступил файл формата gif
Также в скрипте добавляем вторую строку для построения надписи. Данный скрипт получает данные параметром GET, поэтому извлекать данные будем из суперглобала $_GET.
img.php?u=’.$user.’&h=’.$hit.’» в этой строке мы присвоили переменной $_GET['u'] значение $user, а $_GET['h'] – значение $hit. Это весьма простой способ предачи параметров скрипту. Но такой метод не рекомендуется для передачи пароля или каких либо важных данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?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
Для начала необходимо создать таблицу , в которой мы будем хранить все данные. Если вы тестируете на локальном сервере, то запрос будет следующий:
CREATE TABLE `counter` (
`id` INT( 20 ) NOT NULL AUTO_INCREMENT ,
`hosts` INT( 20 ) NOT NULL ,
`hits` INT( 20 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM
При работе с базой данных поменяется только файл counter.php
counter.php
В этом примере все намного проще. Первым шагом подключаемся к БД.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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
Оставляем без изменений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?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, впереди много интересного.
Октябрь 29th, 2009 at 01:58
В инете одно Г
Октябрь 29th, 2009 at 01:33
Великое чудо!
Октябрь 29th, 2009 at 01:15
Она пойдем из дома и ложились
Октябрь 26th, 2009 at 00:17
Если вместо картинки появляется надпись из alt, а при просмотре в браузере самого скрипта img.php появляется сообщение об ошибке вида Warning: Cannot add header information – headers already sent by (output started at /www/script.php:5) on line 20, скорее всего, поможет решение, указанное тут http://www.phpfaq.ru/headers
Октябрь 23rd, 2009 at 00:51
и размерчик и фасон. выбор на любой сезон
Октябрь 22nd, 2009 at 23:23
Яхууу
Октябрь 22nd, 2009 at 22:15
у тебя сын, а у меня дочь!
Октябрь 22nd, 2009 at 21:30
у меня сын родился!
Октябрь 22nd, 2009 at 20:19
Ура, наступает зима!!
Октябрь 22nd, 2009 at 19:55
гы, а мне нравится