-
UPGRADE. Статистика на сайте часть 2. Графический счетчик хитов и посещений.
Июнь 30th, 2008 59 КомментариевВведение
Данный урок является дополнением к уроку №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!59 Responses to “UPGRADE. Статистика на сайте часть 2. Графический счетчик хитов и посещений.”
Leave a Reply



Сентябрь 18th, 2008 at 23:11
Только знаки отношений надо ставить наоборот,в исходниках правильный вариант.
Тут
if($_GET['h']100 )
Надо
if($_GET['h']>=10 AND $_GET['h']<100 )
И ссылочка на исходники неправильная.
А вообще-спасибо,очень нравятся уроки
Сентябрь 24th, 2008 at 17:49
Все делаю как у вас описано, но картинка не появляется(крестик вместо нее), подскажите, пожалуйста, в чем моя ошибка.
за сайт Пятерочка)))
Октябрь 8th, 2008 at 02:14
[...] постов. Кстати именно благодаря этому блогу я научился делать свой собственный счетчик постов. Я в [...]
Октябрь 9th, 2008 at 11:40
В обоих примерах не выходит картинка, что делать?
Октябрь 9th, 2008 at 12:03
Андрей возможно допущены какие то ошибки, обратитесь напрямую к скрипту через адресную строку :
http://адрес/img.php?u=20&h=30
Должен вывести счетчик с показателями 20 и 30
Ноябрь 26th, 2008 at 18:49
2
3
4
$im = ImageCreateFromGif("bg.gif");</p>
// Цвет текста
$black = imagecolorallocate($im,255,255,255);
Вот тут тег
лишний!
Декабрь 20th, 2008 at 21:49
UPDATE counter SET hosts=’».$r['hosts'].»‘,hits=’».$r['hits'].»‘ WHERE id=’counter’»);
id=’counter’ – это что за значение? Ведь id – int and auto_increment. Или я чего-то не понял?
Декабрь 26th, 2008 at 08:13
Читаешь это и думаешь….
Февраль 6th, 2009 at 21:55
Секунды складываются с часами умноженными на 3600 ?
Февраль 7th, 2009 at 10:42
Здесь устанавливаются куки до конца дня.
Март 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″. Как исправить чтобы работало?
Март 11th, 2009 at 23:02
А ты попробуй занеси в базу нулевые значения. Ошибка скорее всего из за того что там пусто.Иначе бы mysql_fetch_array() не возвращал ошибку.
Март 12th, 2009 at 00:37
Спасибо
Вставил значения и заработало, но несразу, пришлось ещё id строки:
Редоктировать установил id=’1′ как и в таблице. Хотя зачем в исходниках id там вообще без него тоже работает.
Июнь 5th, 2009 at 20:13
Можно к себе в блог эту статью поместить? Я напишу, взято с (и ваш сайт) ?
Июль 17th, 2009 at 17:51
А как с вами лично пообщаться? Это вообще реально?
Июль 20th, 2009 at 14:14
Почему так хило обновляете сайт?
Сентябрь 9th, 2009 at 11:15
Хочу сказать, что об убийстве Авраама Линкольна снимут фильм
советую посмотреть
Сентябрь 12th, 2009 at 04:36
Строительство деревянных домов, бань,
беседок и малых архитектурных форм из клееного и профилированного бруса, рубленого леса, высококачественного оцилиндрованного бревна.
Сентябрь 13th, 2009 at 08:04
Здесь вы можете скачать бесплатно 80 гост инструкция и многое другое на нашем сайте
Сентябрь 15th, 2009 at 02:32
Описание жизни девушки в мельчайших подробностях.
Мой дневничок – маленькая жизнь в бескрайнем мире!
Ежедневное обновление и пополнение блога!
Сентябрь 16th, 2009 at 00:51
Доброго времени суток! Як сделать статистику по датам? Чтобы показывало сколько посетителей за каждый день?
Сентябрь 17th, 2009 at 03:24
Лучший и старейший в интернет секс шоп огромный интим ассортимент.
Блог каталог обсуждение интим игрушек и мнения пользователей по каждому товару!
Сентябрь 18th, 2009 at 03:55
Секси платья и чулки интимные украшения и бижутерия ролевые эротические костюмы Зайка Кошка Медсестра Школьница Снегурочка блог
обсуждений
Сентябрь 19th, 2009 at 07:27
Сентябрь 20th, 2009 at 04:13
Заметки о блогосфере, блогах, блоггерах,
интернете, управлении проектами и бизнесе.
Сентябрь 21st, 2009 at 04:41
Инвестиции Швейцария . Покупка недвижимости в Швейцарии: участки земли, шале, апартаменты , аренда недвижимости в Швейцарии
инвестиции, получение вида на жительство в Швейцарии. Открытие компании в кантоне Вале . swissinvest.su
Сентябрь 23rd, 2009 at 04:55
Сайт про деятельность кафедры и информация для абитуриентов и студентов про учебные дисциплины и будущие профессии, которым обучают на кафедре.
Сентябрь 30th, 2009 at 23:12
RSS у меня одного не работает???
Октябрь 2nd, 2009 at 04:02
Купить изделия для коррекции фигуры и электронные часы
Октябрь 20th, 2009 at 18:29
Если б я знал что после свадьбы заканчивается жизнь, я бы не жинился:(
Октябрь 20th, 2009 at 20:30
Вот и зама на подходе, новый год скоро ура!
Октябрь 20th, 2009 at 20:35
надеюсь зима будет такая же как в прошлом году, помню на крещенские морозы было -1
Октябрь 21st, 2009 at 02:14
Отличный сайт, на котором вы можете просмотреть фильмы в режиме онлайн. Очень часто на сайте появляется новинки и настоящие шевры киноискусства
Октябрь 22nd, 2009 at 06:20
Нет ничего лучше, чем хлеб с маслом
Октябрь 22nd, 2009 at 06:26
Главное сейчас витаминки попить, а то за зиму все выйдет из организма и весной будем вялыми..
Октябрь 22nd, 2009 at 15:22
Вот и все проходит осень
Октябрь 22nd, 2009 at 15:23
Жена дура вчера выдернула комп из розетки… все слетело , винду полночи переставлял
Октябрь 22nd, 2009 at 19:14
в жизни атк бываееет , что любовь приходит вновь!!
Октябрь 22nd, 2009 at 19:16
бывает всякое ведь в жизни
Октябрь 22nd, 2009 at 19:54
а мне кажется все это белеберда
Октябрь 22nd, 2009 at 19:55
гы, а мне нравится
Октябрь 22nd, 2009 at 20:19
Ура, наступает зима!!
Октябрь 22nd, 2009 at 21:30
у меня сын родился!
Октябрь 22nd, 2009 at 22:15
у тебя сын, а у меня дочь!
Октябрь 22nd, 2009 at 23:23
Яхууу
Октябрь 23rd, 2009 at 00:51
и размерчик и фасон. выбор на любой сезон
Октябрь 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
Октябрь 29th, 2009 at 01:15
Она пойдем из дома и ложились
Октябрь 29th, 2009 at 01:33
Великое чудо!
Октябрь 29th, 2009 at 01:58
В инете одно Г
Октябрь 31st, 2009 at 02:42
Ваще все пучком идет
Октябрь 31st, 2009 at 03:42
я по адресу?
Ноябрь 1st, 2009 at 07:27
Ноябрь 3rd, 2009 at 03:47
Спасибо за обновление
Ноябрь 3rd, 2009 at 17:53
«Блог интересный спасибо автору, побольше бы таких статей по существу»
Декабрь 11th, 2009 at 01:44
Лесбиянки, аматорский секс, видео эротика
Декабрь 12th, 2009 at 18:24
Строительство из металлоконструкций недорого
Декабрь 17th, 2009 at 01:48
интернет мебель малайзии – спальни, столы и стулья а также кожаная мебель, шкафы для обуви, напольные вешалки и т.д. Заслуженным спросом пользуется мягкая обстановка, поставляемая из Малайзии. Диваны из Малайзии, а также футоны . обеденные стулья – малайзийские группы из массива гевеи превосходным . Обеденные из Китая – известный выбор пропорционально всесторонне цене.
Январь 26th, 2010 at 14:34
Богатый жених – Знакомства с в брачном агентстве!