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, впереди много интересного.
Сентябрь 15th, 2009 at 02:32
Описание жизни девушки в мельчайших подробностях.
Мой дневничок – маленькая жизнь в бескрайнем мире!
Ежедневное обновление и пополнение блога!
Сентябрь 13th, 2009 at 08:04
Здесь вы можете скачать бесплатно 80 гост инструкция и многое другое на нашем сайте
Сентябрь 12th, 2009 at 04:36
Строительство деревянных домов, бань,
беседок и малых архитектурных форм из клееного и профилированного бруса, рубленого леса, высококачественного оцилиндрованного бревна.
Сентябрь 9th, 2009 at 11:15
Хочу сказать, что об убийстве Авраама Линкольна снимут фильм
советую посмотреть
Июль 20th, 2009 at 14:14
Почему так хило обновляете сайт?
Июль 17th, 2009 at 17:51
А как с вами лично пообщаться? Это вообще реально?
Июнь 5th, 2009 at 20:13
Можно к себе в блог эту статью поместить? Я напишу, взято с (и ваш сайт) ?
Март 12th, 2009 at 00:37
Спасибо
Вставил значения и заработало, но несразу, пришлось ещё id строки:
Редоктировать установил id=’1′ как и в таблице. Хотя зачем в исходниках id там вообще без него тоже работает.
Март 11th, 2009 at 23:02
А ты попробуй занеси в базу нулевые значения. Ошибка скорее всего из за того что там пусто.Иначе бы mysql_fetch_array() не возвращал ошибку.
Март 11th, 2009 at 22:27
Неработает Счетчик на MySQL. данные недобовляются в таблицу((
на страничку:http://localhost/index.php выводится при обращении первый раз картинка с двумя единицами при обнавлении остаётся толко одна единица на картинки.
если строки:
2
$r = mysql_fetch_array($q);
Изменить на:
2
$r = mysql_fetch_array($q) or die("2");
выводится «2″. Как исправить чтобы работало?