-
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);
?>Исходники
Результат работы скрипта примерно такой:
59 Responses to “UPGRADE. Статистика на сайте часть 2. Графический счетчик хитов и посещений.”
Страниц: [6] 5 4 3 2 1 » Show All
Страниц: [6] 5 4 3 2 1 » Show All
Leave a Reply



Январь 26th, 2010 at 14:34
Богатый жених – Знакомства с в брачном агентстве!
Декабрь 17th, 2009 at 01:48
интернет мебель малайзии – спальни, столы и стулья а также кожаная мебель, шкафы для обуви, напольные вешалки и т.д. Заслуженным спросом пользуется мягкая обстановка, поставляемая из Малайзии. Диваны из Малайзии, а также футоны . обеденные стулья – малайзийские группы из массива гевеи превосходным . Обеденные из Китая – известный выбор пропорционально всесторонне цене.
Декабрь 12th, 2009 at 18:24
Строительство из металлоконструкций недорого
Декабрь 11th, 2009 at 01:44
Лесбиянки, аматорский секс, видео эротика
Ноябрь 3rd, 2009 at 17:53
«Блог интересный спасибо автору, побольше бы таких статей по существу»
Ноябрь 3rd, 2009 at 03:47
Спасибо за обновление
Ноябрь 1st, 2009 at 07:27
Октябрь 31st, 2009 at 03:42
я по адресу?
Октябрь 31st, 2009 at 02:42
Ваще все пучком идет