программирование на PHP
Bullet (black) Email иконка RSS иконка
  • 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.'&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

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

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

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

    1. 1
      v1ru$No Gravatar Says:

      Только знаки отношений надо ставить наоборот,в исходниках правильный вариант.
      Тут
      if($_GET['h']100 )
      Надо
      if($_GET['h']>=10 AND $_GET['h']<100 )

      И ссылочка на исходники неправильная.

      А вообще-спасибо,очень нравятся уроки

    2. 2
      yulyakaNo Gravatar Says:

      Все делаю как у вас описано, но картинка не появляется(крестик вместо нее), подскажите, пожалуйста, в чем моя ошибка.

      за сайт Пятерочка)))

    3. 3
      Воскресный обзор блогов | Заметки Сис.Админа Says:

      [...] постов. Кстати именно благодаря этому блогу я научился делать свой собственный счетчик постов. Я в [...]

    4. 4
      АндрейNo Gravatar Says:

      В обоих примерах не выходит картинка, что делать?

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

      В обоих примерах не выходит картинка, что делать?

      Андрей возможно допущены какие то ошибки, обратитесь напрямую к скрипту через адресную строку :
      http://адрес/img.php?u=20&h=30

      Должен вывести счетчик с показателями 20 и 30

    6. 6
      АнтонNo Gravatar Says:
      1
      2
      3
      4
      // Подложка для счетчика
      $im = ImageCreateFromGif("bg.gif");</p>
      // Цвет текста
      $black = imagecolorallocate($im,255,255,255);

      Вот тут тег

      1
      </p>

      лишний!

    7. 7
      OlegNo Gravatar Says:

      UPDATE counter SET hosts=’».$r['hosts'].»‘,hits=’».$r['hits'].»‘ WHERE id=’counter’»);

      id=’counter’ – это что за значение? Ведь id – int and auto_increment. Или я чего-то не понял?

    8. 8
      strNo Gravatar Says:

      Читаешь это и думаешь….

    9. 9
      АнтонNo Gravatar Says:
      1
      <?php setcookie("freshcoder","count",time()+(24-date('G'))*3600);?>

      Секунды складываются с часами умноженными на 3600 ?

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

      Здесь устанавливаются куки до конца дня.

    11. 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″. Как исправить чтобы работало?

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

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

    13. 13
      RX200No Gravatar Says:

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

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

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

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

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

    15. 15
      lpypNo Gravatar Says:

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

    16. 16
      paiNo Gravatar Says:

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

    17. 17
      dimitryNo Gravatar Says:

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

    18. 18
      vesrubvesrubNo Gravatar Says:

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

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

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

    20. 20
      moy-dnevni4okNo Gravatar Says:

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

    21. 21
      AlexNo Gravatar Says:

      Доброго времени суток! Як сделать статистику по датам? Чтобы показывало сколько посетителей за каждый день?

    22. 22
      TerimasovNo Gravatar Says:

      Лучший и старейший в интернет секс шоп огромный интим ассортимент.
      Блог каталог обсуждение интим игрушек и мнения пользователей по каждому товару!

    23. 23
      12wear12No Gravatar Says:

      Секси платья и чулки интимные украшения и бижутерия ролевые эротические костюмы Зайка Кошка Медсестра Школьница Снегурочка блог
      обсуждений

    24. 24
      xxx4dvd12No Gravatar Says:
    25. 25
      oyurkov2009No Gravatar Says:

      Заметки о блогосфере, блогах, блоггерах,
      интернете, управлении проектами и бизнесе.

    26. 26
      swissestateNo Gravatar Says:

      Инвестиции Швейцария . Покупка недвижимости в Швейцарии: участки земли, шале, апартаменты , аренда недвижимости в Швейцарии
      инвестиции, получение вида на жительство в Швейцарии. Открытие компании в кантоне Вале . swissinvest.su

    27. 27
      ВадимNo Gravatar Says:

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

    28. 28
      АввакумNo Gravatar Says:

      RSS у меня одного не работает???

    29. 29
      Интернет-магазин можно заказать товары для а также электростимуляторыNo Gravatar Says:

      Купить изделия для коррекции фигуры и электронные часы

    30. 30
      СпартакNo Gravatar Says:

      Если б я знал что после свадьбы заканчивается жизнь, я бы не жинился:(

    31. 31
      РусланNo Gravatar Says:

      Вот и зама на подходе, новый год скоро ура!

    32. 32
      АдамNo Gravatar Says:

      надеюсь зима будет такая же как в прошлом году, помню на крещенские морозы было -1 :)

    33. 33
      РоманNo Gravatar Says:

      Отличный сайт, на котором вы можете просмотреть фильмы в режиме онлайн. Очень часто на сайте появляется новинки и настоящие шевры киноискусства

    34. 34
      ПанкратNo Gravatar Says:

      Нет ничего лучше, чем хлеб с маслом

    35. 35
      НикодимNo Gravatar Says:

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

    36. 36
      ЛукьянNo Gravatar Says:

      Вот и все проходит осень

    37. 37
      ЭрнестNo Gravatar Says:

      Жена дура вчера выдернула комп из розетки… все слетело , винду полночи переставлял

    38. 38
      ГаврилаNo Gravatar Says:

      в жизни атк бываееет , что любовь приходит вновь!!

    39. 39
      ФотийNo Gravatar Says:

      бывает всякое ведь в жизни

    40. 40
      РатмирNo Gravatar Says:

      а мне кажется все это белеберда

    41. 41
      ГедеонNo Gravatar Says:

      гы, а мне нравится

    42. 42
      МихейNo Gravatar Says:

      Ура, наступает зима!!

    43. 43
      ЛеонидNo Gravatar Says:

      у меня сын родился!

    44. 44
      МстиславNo Gravatar Says:

      у тебя сын, а у меня дочь!

    45. 45
      ФирсNo Gravatar Says:

      Яхууу

    46. 46
      ЕрмолайNo Gravatar Says:

      и размерчик и фасон. выбор на любой сезон

    47. 47
      TyomychNo Gravatar Says:

      Если вместо картинки появляется надпись из 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

    48. 48
      НаумNo Gravatar Says:

      Она пойдем из дома и ложились

    49. 49
      ВасилийNo Gravatar Says:

      Великое чудо!

    50. 50
      ДенисNo Gravatar Says:

      В инете одно Г

    51. 51
      ТимофейNo Gravatar Says:

      Ваще все пучком идет

    52. 52
      ТворимирNo Gravatar Says:

      я по адресу?

    53. 53
      видео порнухаNo Gravatar Says:

      :D DD

    54. 54
      ПавелNo Gravatar Says:

      Спасибо за обновление :)

    55. 55
      AlexNo Gravatar Says:

      «Блог интересный спасибо автору, побольше бы таких статей по существу»

    56. 56
      jhhgsaaaNo Gravatar Says:

      Лесбиянки, аматорский секс, видео эротика

    57. 57
      Строительство,ремонт,отделкаNo Gravatar Says:

      Строительство из металлоконструкций недорого

    58. 58
      maomaodzeNo Gravatar Says:

      интернет мебель малайзии – спальни, столы и стулья а также кожаная мебель, шкафы для обуви, напольные вешалки и т.д. Заслуженным спросом пользуется мягкая обстановка, поставляемая из Малайзии. Диваны из Малайзии, а также футоны . обеденные стулья – малайзийские группы из массива гевеи превосходным . Обеденные из Китая – известный выбор пропорционально всесторонне цене.

    59. 59
      богатый жених,замуж за иностранца,богатый мужчинаNo Gravatar Says:

      Богатый жених – Знакомства с в брачном агентстве!

    Leave a Reply


freshcoder.ru © 2008 • При использовании материалов активная ссылка на сайт обязательна.