программирование на 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. Графический счетчик хитов и посещений.”

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

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

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

    2. 58
      maomaodzeNo Gravatar Says:

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

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

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

    4. 56
      jhhgsaaaNo Gravatar Says:

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

    5. 55
      AlexNo Gravatar Says:

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

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

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

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

      :D DD

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

      я по адресу?

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

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

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

    Leave a Reply


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