RTFM! статьи, советы, скрипты
::Заработок с помощью сайта ::JScript по-русски! ::Все русские мануалы::
МЕНЮ
О САЙТЕ
НОВОСТИ
СТАТЬИ
КНИГИ
АППЛЕТЫ
СВЯЗЬ

СЧЕТЧИКИ
Rambler's Top100
Рейтинг@Mail.ru
Яндекс цитирования

Триада PHP & MySQL & gd library

Автор: Владимир Гойда Сайт: http://lib.rin.ru     Рейтинг: N/A из 7       <<НАЗАД
   
   Сервис счетчиков обращений
   
   Php - (Hypertext Preprocessor) - платформо-независимый язык для динамического наполнения WEB-сайта. Тем неменее, он позволяет динамически генерировать не только HTML-документы, но и графические изображения в формате gif. В статье рассмотрены вопросы обработки параметров get-запроса, доступа к базе MySQL и генерации gif-рисунков на практическом примере.
   Когда у вас будет свой сайт вы безусловно захотите вести статистику посещений.
   
   Если вы предоставляете место и траффик для бесплатного размешения страниц и хотите предоставить каждому пользователю неограниченное количество счетчиков, но без права исполнения скриптов, то эта статья для Вас.
   Как это работает? Web-мастер помещает на свою страницу ссылку на рисунок. Но не gif или jpeg, а на этот php скрипт. Положим, ссылка на счетчик страницы `Об авторе`, расположенной на моем сайте будет выглядеть так:
   <img src="/scripts/counter.php3?SiteID=Vlad&PageID=About">
   Здесь SiteID и PageID - так называемые get-параметры, а Vlad и About - их значения. Эти get-параметры идентифицируют счетчик. Скрипт найдет соответсвующую запись в базе, увеличит значение счетчика на еденицу и построит рисунок Мы еще не представляем как будет выглядеть все остальное но уже можем обработать get-параметры
   $locSiteID = $HTTP_GET_VARS["SiteID"];
   $locPageID = $HTTP_GET_VARS["PageID"];
   Здесь следует остановиться на важном моменте. Дело в том, что по правилам php имена переменных и get-параметров чувствительны к регистру. Это значит, что если человек напишет ссылку и get-параметры прописными буквами, то наш скрипт не сможет распознать такой запрос. Поэтому я предлагаю не такой изящный, но очень надежный способ интерпреции get-параметров. Состоит он вот в чем: последоватьным перебором всех get-параметров попытаемся найти интересующие нас SiteID и PageID.
   Причем при поиске используем нечувствительное к регистру сравнение строк:
   $locSiteID = "_";
   $locPageID = "_";
   while (list($key, $val) = each($HTTP_GET_VARS))
   {
    if (strcmp(strtoupper($key),"SITEID")==0) $locSiteID = "_" . $val;
    if (strcmp(strtoupper($key),"PAGEID")==0) $locPageID = "_" . $val;
   }
   Здесь префикс "_" необходим для MySQL-движка. Далее установим базу счетчиков
   Counters
   mysqladmin create Counters
   и создадим в ней таблицу Counters. Таблица как вы наверно уже догадались,
   состоит из трех полей: SiteID, PageID, CountValue:
   Create Table Counters (
   SiteID char(120) not null,
   PageID char(120) not null,
   CountValue int,
   index CounterIndex (SiteID,PageID));
   Обратите внимание на индекс CounterIndex. Поля, входящие в индекс, должны иметь атрибут NOT NULL, размер ключей (читай полей, входящих в индекс) не должен превышать 256 символов. И последнее - порядок полей в индексе должен совпадать с порядком в секции Where SQL запроса. Если же Вы планируете небольшую базу и колчество записей невелико, то индекс можно и не создавать.
   Для работы с базой нам потребуется всего три запроса:
   · Создать новую запись в базе при первом обращении к счетчику:
   Insert Into Counters (SiteID,PageID,CountValue) Values
   (`$locSiteID`,`$locPageID`,1)
   · Найти значение счетчика:
   select * from counters where SiteID=`$locSiteID` AND PageID=`$locPageID`
   · Увеличить значение счетчика на еденицу:
   Update Counters Set CountValue = CountValue+1 Where SiteID = `$locSiteID` AND
   PageID = `$locPageID`
   А теперь самое время вспомнить про префикс "_" значений get-параметров. На самом деле все очень просто. Посмотрите на структуру таблицы. Поля SiteID, PageID помечены аттрибутом NOT NULL, и префикс "_" позволяет пропустить один или даже оба параметра в get-запросе:
   // Нечувствительные к регистру get-параметры
   $locSiteID = "_";
   $locPageID = "_";
   while (list($key, $val) = each($HTTP_GET_VARS))
   {
    if (strcmp(strtoupper($key),"SITEID")==0) $locSiteID = "_" . $val;
    if (strcmp(strtoupper($key),"PAGEID")==0) $locPageID = "_" . $val;
   }
   
   // Соеденяемся с базой Counters и запрашиваем значение счетчика
   mysql_connect("localhost:3306","root","");
   if (!($result = mysql_db_query("Counters","select * from counters where
   SiteID=`$locSiteID` AND PageID=`$locPageID`")))
   {
    // База Counters не доступна - катапультируемся
    echo "Cannot query database Counters\n";
    echo "Query Error " . mysql_errno() . " " . mysql_error();
    exit;
   }
   
   $FirstVisit=1;
   while($row = mysql_fetch_object($result))
   {
    $FirstVisit=0;
    $locCountValue = $row->CountValue;
   }
   mysql_free_result($result);
   
   if ($FirstVisit==1)
   { // Первое обращение. Создаем запись в базе
    $result = mysql_db_query("Counters","Insert Into Counters
   (SiteID,PageID,CountValue) Values (`$locSiteID`,`$locPageID`,1)");
    $locCountValue = 1;
   }
   else
   { // Увеличиваем значение счетчика на еденицу
    $locCountValue = $locCountValue + 1;
    $result = mysql_db_query("Counters","Update Counters Set CountValue =
   CountValue+1 Where SiteID = `$locSiteID` AND PageID = `$locPageID`");
   }
   Преобразовываем число в строку и форматируем в шестизначное число.
    $strCounterValue = sprintf("%d",$locCountValue);
    while(strlen($strCounterValue)<6) $strCounterValue = "0" . $strCounterValue;
    $txtlen = strlen($strCounterValue);
   Далее показано как пользоваться gd library в php для динамического рисования счетчика. Строго говоря, это не самый иллюстративный пример. Шрифты, входящие в библиотеку gd library могут различаться по дистрибутивам, поэтому для этого проекта я использовал спецальный формат представления шрифта и процедуру его отображения. Тем неменее код достаточно документирован и, я надеюсь, поможет вам сделать очередной шаг.
    Header("Content-type: image/gif");
    $DeskWidth=24; $DeskHeight=48; $DeskSpace=5;
   
    /* Создаем рисунок imgWidth * imgHeight pixels. */
    $imgWidth= $txtlen * ($DeskWidth + $DeskSpace) - $DeskSpace;
    $imgHeight = $DeskHeight;
    $im_out = ImageCreate($imgWidth, $imgHeight);
   
    /* Резервируем цвета в палитре*/
    $white = ImageColorAllocate($im_out, 255, 255, 255);
    $grey = ImageColorAllocate($im_out, 0, 0, 77);
    $blue = ImageColorAllocate($im_out, 40, 5, 250);
    $trans = ImageColorAllocate($im_out, 1, 1, 1);
    $red = ImageColorAllocate($im_out, 40, 33, 155);
   
    /* Устанавливаем прозрачный цвет и рисуем фон*/
    ImageColorTransparent($im_out, $trans);
    for ($dy=0; $dy < $imgHeight; $dy++)
    ImageLine($im_out, 0, $dy, $imgWidth-1, $dy, $trans);
    for ($dy=2; $dy < $imgHeight; $dy=$dy+4)
    ImageLine($im_out,0,$dy,$imgWidth-1,$dy,$red);
   
    // Далее выводим цифры по пикселам,
    // сначала "тень" со смещением в один пиксел а поверх и "лицо"
    $CurColor=$white;
    for ($txtcur=0;$txtcur<$txtlen;$txtcur++)
    {
    $bx=$txtcur*($DeskWidth+$DeskSpace);
    for ($dy=0;$dy<$imgHeight;$dy++)
    ImageLine($im_out,$bx,$dy,$bx+$DeskWidth-1,$dy,$blue);
    $bx=$bx+($DeskWidth-22)/2;
    $c=0+$strCounterValue[$txtcur];
    if ($c!=0) $CurColor=$white;
    if (($c>=0) && ($c<=9))
    for ($id=1;$id>=0;$id--)
    {
    if ($id==1) $CurColor=$grey; else $CurColor=$white;
    for ($dy=0;$dy<48;$dy++)
    for ($dx=0;$dx<22;$dx++)
    {
    $my_pos = $c*48*3 + $dy*3 + ($dx>>3);
    $my_byte = $CounterDigitData[$my_pos];
    if ((($my_byte >> (7-($dx & 7))) & 1) == 1)
    ImageSetPixel($im_out,$bx+$dx+$id-1, $dy+$id, $CurColor);
    }
    }
    }
   
    // Отправляем обозревателю картинку ...
    ImageGif($im_out);
    // ... и освобождаем память
    ImageDestroy($im_out);
   =====================================================
   
   


<<НАЗАД      ОЦЕНИТЬ СТАТЬЮ    ВЕРСИЯ ДЛЯ ПЕЧАТИ>>
Статья прочитана :  раз.




пейкюлю



 
 
 
 
 
pauk ©® 2000-2015. All rights reserved.
При перепечатке ссылка на сайт и указание обязательны.
Мнение администрации сайта не всегда совпадает с мнением автора.
Орфография и пунктуация - авторские.
Администрация не несет никакой ответственности за использование материалов.
.
Protected by Copyscape DMCA Takedown Notice Infringement Search Tool