go
komunikace  internet  prog.  web-prog.  hardware  software  bezpečnost  magazín  disk.fórum
   

Spojnicový graf - počítadlo přístupů vytvořený v PHP

počet názorů: 18   poslední: 27.12.2003 15:49:28   číst názory   přidat názor   vytisknout

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




Autor: Rostislav Stríž, informace o autorovi
Rubrika: Programování - PHP
Čtenářů: 1600     Zobrazení: 1960

Jak hodnotíte tento článek?

lepší < -->horší
Názory: počet: 18   poslední: 27.12.2003 15:49:28   číst názory   přidat názor   vytisknout


Nadpis Autor Datum
vyborne Jakub Podhorský 18.11.2003 14:57:35
  Re: vyborne Jakub Podhorský 18.11.2003 14:59:27
    Re: vyborne Rostislav Stríž 18.11.2003 15:57:55
      Re: vyborne Jakub Podhorský 18.11.2003 16:01:14
co s tim dll Jirka 18.11.2003 17:55:11
  Re: co s tim dll Rostislav Stríž 18.11.2003 18:22:59
  Re: co s tim dll Jakub Podhorský 18.11.2003 21:35:09
SQL Dotaz Rene Zamecnik 19.11.2003 12:48:59
Hezké, ale nefunguje pod Operou a těžko říct Burda 19.11.2003 15:25:32
  Re: Hezké, ale nefunguje pod Operou a těžko... Jakub Podhorský 19.11.2003 16:14:12
Komplet mi to nefakci Shokarta 29.11.2003 12:27:36
  Re: Komplet mi to nefakci Jakub Podhorský 29.11.2003 14:33:30
    Re: Komplet mi to nefakci Shokarta 30.11.2003 10:46:20
      Re: Komplet mi to nefakci Jakub Podhorský 30.11.2003 10:56:57
        Re: Komplet mi to nefakci Shokarta 30.11.2003 12:48:24
          Re: Komplet mi to nefakci Jakub Podhorský 30.11.2003 13:06:26
            Re: Komplet mi to nefakci Shokarta 30.11.2003 13:35:02
Zobrazuje se jen cast Shokarta 27.12.2003 15:49:28
Nový příspěvek
Věc:
Jméno:
E-mail:

- nepoužívejte HTML k formátování textu příspěvku
- nepoužívejte A HREF= pro odkazy, aktivní budou automaticky
- odřádkování provádějte klávesou ENTER, nikoliv tagem <br>
zasílat odpovědi na můj e-mail











(c) P.E.S. consulting, s.r.o. 2000-2004. Provozovatel nezodpovídá za obsah a původ článků a diskuzních příspěvků, odpovědnost nesou jednotliví redaktoři a autoři. Informace o PC Světě naleznete zde
Novinka: Bazar
Na PC Světě nově zprovozněn bazar techniky a příslušenství
www.pcsvet.cz/bazar/
ADSL připojení
ADSL připojení
Anketa
Novinky e-mailem
Zasílání denního nebo týdenního přehledu nových článků
Nový redaktor
Chcete se stát přispivatelem pro PC Svět? info a registrace zde



ATLAS.CZ
powered by PES RedSys 3.0





© 2000-2004 pcsvět.cz / pcsvet@pcsvet.cz / ISSN 1213-6042