Зовнішній вигляд лічильника, Робота з графікою, PHP, статті

Ми ще не уявляємо як буде виглядати все інше але вже можемо обробити 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 запиту. Якщо ж Ви плануєте невелику базу і колчество записів невелика, то індекс можна і не створювати.

Для роботи з базою нам потрібно всього три запити:


А тепер саме час згадати про префікс “_” значень 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
";
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);

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*