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.'&amp;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'].'&amp;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);
?>

Исходники

counter.zip

Результат работы скрипта примерно такой:

Пример работы счетчика

Google Bookmarks БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong
rss-лентаПодпишись на RSS, впереди много интересного.
Рубрика: уроки | Отзывов: 59

59 Responses to “UPGRADE. Статистика на сайте часть 2. Графический счетчик хитов и посещений.”

Страниц: « 6 5 4 3 [2] 1 » Show All

  1. 20
    moy-dnevni4okNo Gravatar Says:

    Описание жизни девушки в мельчайших подробностях.
    Мой дневничок – маленькая жизнь в бескрайнем мире!
    Ежедневное обновление и пополнение блога!

  2. 19
    Скачать бесплатно гост бесплатно инструкция начальника и многое другое на нашем порталеNo Gravatar Says:

    Здесь вы можете скачать бесплатно 80 гост инструкция и многое другое на нашем сайте

  3. 18
    vesrubvesrubNo Gravatar Says:

    Строительство деревянных домов, бань,
    беседок и малых архитектурных форм из клееного и профилированного бруса, рубленого леса, высококачественного оцилиндрованного бревна.

  4. 17
    dimitryNo Gravatar Says:

    Хочу сказать, что об убийстве Авраама Линкольна снимут фильм
    советую посмотреть

  5. 16
    paiNo Gravatar Says:

    Почему так хило обновляете сайт?

  6. 15
    lpypNo Gravatar Says:

    А как с вами лично пообщаться? Это вообще реально?

  7. 14
    ТамараNo Gravatar Says:

    Можно к себе в блог эту статью поместить? Я напишу, взято с (и ваш сайт) ?

  8. 13
    RX200No Gravatar Says:

    Спасибо
    Вставил значения и заработало, но несразу, пришлось ещё id строки:

    1
    mysql_query("UPDATE counter SET hosts='".$r['hosts']."',hits='".$r['hits']."' WHERE id='counter'");

    Редоктировать установил id=’1′ как и в таблице. Хотя зачем в исходниках id там вообще без него тоже работает.

  9. 12
    АлександрNo Gravatar Says:

    А ты попробуй занеси в базу нулевые значения. Ошибка скорее всего из за того что там пусто.Иначе бы mysql_fetch_array() не возвращал ошибку.

  10. 11
    RX200No Gravatar Says:

    Неработает Счетчик на MySQL. данные недобовляются в таблицу((
    на страничку:http://localhost/index.php выводится при обращении первый раз картинка с двумя единицами при обнавлении остаётся толко одна единица на картинки.
    если строки:

    1
    2
    $q = mysql_query("SELECT * FROM counter");
    $r = mysql_fetch_array($q);

    Изменить на:

    1
    2
    $q = mysql_query("SELECT * FROM counter") or die("1");
    $r = mysql_fetch_array($q) or die("2");

    выводится «2″. Как исправить чтобы работало?

Страниц: « 6 5 4 3 [2] 1 » Show All

Leave a Reply