Spojnicový graf - počítadlo přístupů vytvořený
v PHP
Chtěli byste si vytvořit na svých internetových stránkách
počítadlo přístupů jako spojnicový graf a
nevíte, jak na to? Přečtěte si můj
návod.
Chtěli byste si vytvořit na svých internetových stránkách
počítadlo přístupů jako spojnicový graf a
nevíte, jak na to? Tak se pozorně začtěte do
následujících řádků. Není to nic složitého,
a ještě se naučíte, jak se v PHP maluje.
Co nejdříve?
Aby vás PHP nechal kreslit a Explorer po vás váš výtvor
"přečetl" , je nejprve bezpodmínečně nutné do
souboru načíst určitou dll knihovnu
podporující právě kreslení. Stačí na to
jednoduchý příkaz. Na začátku do souboru vložíte tento kód:
dl ("php_gd.dll");(Zahlásí-li vám
Explorer chybu, že danou dll knihovnu není schopen
najít, bude to chtít menší úpravu v
php.ini)
Dále musíme prohlížeči oznámit,
že nyní budeme kreslit a ne psát. Provedeme to kódem
header("content_type: image/jpeg");Tyto
počáteční příkazy jsou velmi důležité, ke
správnému běhu dalšího kódu.
Definice konstant
Není bezpodmínečně nutné, abyste si
na začátku programu nadefinovali nějaké
konstanty, ale v tomto případě se mi to
velmi osvědčilo a tak vřele doporučuji.
Definice konstanty není nijak složitá:
DEFINE("nazev_konstanty",hodnota_konstanty);
Pokud
je hodnota konstanty číselná, nezadává se do
uvozovek. Já jsem si na začátku nadefinoval
konstanty pro výšku a šířku obrázku. Rozhodl
jsem se, že kolem grafu bude 50px okraj, takže další
konstantou je konstanta mezera. Vypadá to asi
takto:
DEFINE("mezera", 50);
DEFINE("max_x", mezera + 720 + mezera);
DEFINE("max_y", mezera + 400 + mezera);
DEFINE("popisx",30);Šířka
grafu (max_x) = z obou stran mezera
50px + 720px - z toho lze odvodit, že skutečný
graf bude 720px široký. Na ose x budou totiž naneseny
hodiny: 0 - 23 = celkem 24 hodin a číslo 720
je dělitelné 24 beze zbytku - vychází číslo
30, které jsem si uložil do konstanty
popisx Na ose y budou zase hodnoty přístupů - šířka
grafu bude 400px - proto hodnota konstanty
max_y bude 400 + mezera +
mezera (z obou stran bude 50px
mezera). Toť vše ke konstantám.
Konečně kreslení
Tak a teď jen zadat kód
$img =fnGraf();
ImageJPEG($img);
a
pustíme se do kreslení. Proměnnou
$img jsem si označil obrázek, který teď budeme tvořit.
Teď si nadeklarujeme funkci fnGraf ,
která nám na konci vrátí graf.
function fnGraf()
{
//nasledny kod budete vpisovat pred prikaz return
return $img;
}
!!
Příkaz return musí mýt až na samém konci
funkce fnGraf().!! Ale teď rychle a bez
zbytečných popisování do díla.
Teď si vytvoříme plochu pro obrázek s rozměry max_x a
max_y.
$img=ImageCreate(max_x,max_y);
!!
Příkaz
ImageCreate(velikost_osy_x,velikost_osy_y)
vytvoří pracovní pole pro malování. !!
Nyní
je potřeba nadeklarovat barvy:
$bgcolor=ImageColorAllocate($img,204,248,255);
//barva pozadi
$lncolor=ImageColorAllocate($img,0,0,0);
//barva lncolor
Příkaz
ImageColorAllocate($img,rgb_1,rgb_2,rgb_3); vytvoří
barvu podle RGB.
Tak a teď už jdeme
na samotné malování - ještě ale pozor.
PHP začíná osy x,y v LEVÉM
HORNÍM ROHU - BOD [0,0] je vlevo
nahoře
Dále potřebujeme vytvořit obdélník 50px
od všech okrajů obrázků - jeho rozměry budou
720x400: Použijeme příkaz ImageLine.
ImageLine($img,souradnice_x_1,souradnice_y_1,souradnice_x_2,souradnice_y_2,$barva_cary);
nakreslí čáru začínající v bodě x_1 a y_1 a
vedoucí do bodu y_1 a y_2
V našem
případě je tedy nutné, abychom namalovali
obdélník , napsat kód:
ImageLine($img,mezera,mezera,max_x-mezera,mezera,$lncolor); //horni cara
ImageLine($img,mezera,max_y - mezera,max_x-mezera,max_y-mezera,$lncolor); //dolni cara
ImageLine($img,mezera,mezera,mezera,max_y - mezera,$lncolor); //leva bocni cara
ImageLine($img,max_x - mezera,mezera,max_x - mezera,max_y - mezera,$lncolor); //prava bocni cara
Takto
vytvořený objekt bude vypadat asi takto.

Nyní
si nadeklarujeme další barvu, kterou poté
náš obdélník vyplníme.
$color = ImageColorAllocate($img,100,200,250);
ImageFill($img,60,60,$color);
ImageFill($img,souradnice_x_nekde-vevnitr-obdelniku,souradnice_y_nekde-vevnitr-obdelniku,$color);
- Tak tento příkaz funguje naprosto stejně
jako nástroj na vymalovávání objektů v
malování - zadáte místo někde uvnitř
objektu, který chcete vybarvit, a příkaz vám ho vybarví
zadanou barvou.
Pokud sledujete můj kód,
měli byste teď na obrazovce vidět něco jako

Tak
a základní rámec, uvnitř něhož se bude
nacházet náš graf, je hotov. Blahopřeji!
První část je za námi.
Popis grafu - osa x
Jako první musíme popsat dolní osu x a to čísly od 0 do 23
- jako čísla hodin. Provedeme to jednoduchým
cyklem.
$a=0;
while ($a < 24 )
{
ImageString($img,3,mezera + (popisx * $a) ,max_y - mezera,$a,$lncolor);
$a++;
}
ImageString($pic,velokost
pisma,
souradnice_x_pismena,souradnice_y_pismena,$text,$barva);
vypíše $text určenou velikostí na
souřadnice x_pismena a
y_pismena
POZOR!
popisx - konstanta = 30px, každé písmeno bude mít z
obou stran 30 px místo !!
Tímto cyklem
docílíte následného efektu:

A
osa x je přehledně popsaná.
Popis grafu - osa y
Nyní se nacházíme asi v nejtěžší části našeho projektu.
Nejprve musíme z databáze zjistit maximální
počet přístupů za daný den. Tento počet bude
označovat vrchní hranici grafu. Poté musíme
přepočítat přístupy na pixely a vytvořit spojnici.
Ale pěkně po pořádku: Nejprve bych vám doporučoval
stáhnout si zde moji vytvořenou MySQL
tabulku counter. STAHUJ
ZDE (2kb) - couter.sql
Do tabulky se zaznamenává mimo jiné den, měsíc a rok
přístupu. Vybereme si tedy jeden den v roce a poté
vygenerujeme graf. V mé tabulce je nejlepší
použít datum 30.10.2003 - nadeklarujeme tedy
proměnné:
$den=30;
$mesic=10;
$rok=2003 ;
Dále se
připojíme k databázi:
$link = mysql_connect("localhost","counter","vase_heslo");
Tak
a teď nejdůležitější úkon: Do pole $pristup[]
vložíme během cyklu hodnoty přístupů v jednotlivých
hodinách:
$b = 0;
while ($b<24)//24 hodin - potrebuji zjistit pocet pristupu za kazdou hodinu
{
$select="SELECT count(*) FROM counter WHERE den=$den AND mesic=$mesic AND rok=$rok and hod=$b";
$res=mysql_db_query("jmeno_databaze",$select,$link);
$ar=mysql_fetch_row($res);
$pristup[$b]=$ar[0];
mysql_free_result($res);
$b++;
}
mysql_close($link);
Tak
a teď máme v poli $pristup[] uloženy všechny
potřebné hodnoty. Nyní musíme zjistit, jaký byl
nejvyšší počet přístupů na stránky v určený
den. Fce MAX($pole) zjistí největší
počet z prvků v poli - podle něj pak určíme
popisky osy y.
$max=MAX($pristup);
Teď máme potřebnou
hodnotu uloženou v proměnné $max.
Již známým příkazem ImageString si tuto
hodnotu vypíšeme do dolní části obrázku, pod osu x.
ImageString($img,5,mezera + popisx + popisx ,max_y - mezera + 30,$max,$lncolor);
Nyní
namalujeme přes graf čáry souběžné s osou x - pro
větší přehlednost. Výška grafu je 400px - graf rozdělíme
na 20 částí po 20px. Proměnná
$popisy bude značit výšku jednoho
vzniklého pole. K nalinkování budeme potřebovat celkem
19 linek.
$popisy=20;
$l=1;
while($l<=19)
{
ImageLine($img,mezera,max_y - mezera - $popisy * $l,max_x-mezera,max_y -mezera - $popisy * $l,$lncolor);
//linkovani
$l++;
}
A
je to! Mělo by to vypadat asi nějak takto:

Následně
si do proměnné $y_value uložíme,
kolik přístupů bude znázorňovat jeden pixel.
Uděláme to velmi jednoduše tak, že proměnnou
$max vydělíme výškou grafu - tj. 400
(Proměnná $max má v našem případě za datum 30.10.2003
hodnotu 93)
$y_value=$max / 400 ;
Teď přepočítáme,
jaké hodnoty budou u každé linky jako
popisky osy y - uděláme to tak, že proměnnou $y_value
vynásobíme 20 - dostaneme počet přístupů na 20px a
dále toto číslo budeme násobit v cyklu
rostoucí proměnnou: - čísla zapíšeme,jak
jinak, příkazem ImageString.
$d = 1;
while ($d<=20)
{
ImageString($img,3,mezera - 20,max_y - mezera - $popisy * $d - 5,($y_value * 20 * $d),$lncolor);
//5 je v tomto pripade jakasi solichalova konstanta na dorovnani nerovnosti
$d++;
}
Uvidíme
následující obrázek:

Hodnoty
na ose y jsou velmi "nepěkné" -
nezaokrouhlené - použijeme tedy v předchozím
cyklu funkci ROUND($cislo): Upravený
kód bude vypadat následovně:
$d = 1;
while ($d<=20)
{
ImageString($img,3,mezera - 20,max_y - mezera - $popisy * $d - 5,ROUND($y_value * 20 * $d),$lncolor);
//5 je v tomto pripade jakasi solichalova konstanta na dorovnani nerovnosti
$d++;
}
A
je to.

Vynesení spojnicového grafu
Nyní už do připraveného pole vyneseme spojnicový graf. Ve
výše zmiňovaném poli $pristup[] máme
zaznamenány hodnoty přístupů na stránky v
určitých hodinách. Teď pomocí cyklu do grafu
vyneseme body - hodnoty přístupů (na ose y) v
určité hodiny (na ose x). Poté body spojíme již známým
příkazem ImageLine. Tak do toho:
$pr=0;
$grcolor = ImageColorAllocate($img,500,0,0); //deklarace nove barvy pro spojnici grafu
while ($pr<24)
{
ImageLine($img,mezera + (popisx * $pr),max_y - mezera - ($pristup[$pr]/
$y_value),mezera + (popisx * ($pr + 1)),max_y - mezera -($pristup[($pr+1)]/
$y_value),$grcolor);
//vyse uvedeny prikaz ImageLine patri na jeden radek
$pr++;
}
Finální výtvor vypadá takto:

Tak a to je vše, vypadá to poněkud komplikovaně, ale po
bližším prozkoumání to ani komplikované není.
Přesto zde pro zájemce dávám ke stažení
soubor graf.php , který je opatřen
přehlednými popisky a který vám po mírné úpravě např.
jména databáze vykreslí celý spojnicový graf, který
poté stačí jen vhodně zakomponovat do vašeho
webu. Přeji hodně úspěchů! STAHUJ
ZDE (2kb) -
graf.php