Měsíční statistika v grafu pomocí GD knihovny » PHP scripty » Blog » CrazyDog ~ Multi-blog

Měsíční statistika v grafu pomocí GD knihovny

Ne, 13. leden 2008, 11:36
Měsíční statistika v grafu pomocí GD knihovny

V minulém článku jsme si ukázali jak na podrobné statistiky návštěvnosti ve kterých jsme si zařídili i měsíční statistiku, kterou si v tomto článku převedeme do grafu generovaného GD knihovnou v PHP.

Celý graf by měl v konečném výsledku vypadat nějak takto:

Nejprve si vložte do souboru graf.php tento PHP script:

<?php
$rok = date("Y");

function mesic($mes) { include("./db.php"); /* přístup k databázi*/ $rok = date("Y");

if($mes == "Led") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-01-00'")); return $mesic['pocet']; } elseif($mes == "Úno") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-02-00'")); return $mesic['pocet']; } elseif($mes == "Bře") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-03-00'")); return $mesic['pocet']; } elseif($mes == "Dub") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-04-00'")); return $mesic['pocet']; } elseif($mes == "Kvě") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-05-00'")); return $mesic['pocet']; } elseif($mes == "Čen") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-06-00'")); return $mesic['pocet']; } elseif($mes == "Čec") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-07-00'")); return $mesic['pocet']; } elseif($mes == "Srp") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-08-00'")); return $mesic['pocet']; } elseif($mes == "Zář") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-09-00'")); return $mesic['pocet']; } elseif($mes == "Říj") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-10-00'")); return $mesic['pocet']; } elseif($mes == "Lis") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-11-00'")); return $mesic['pocet']; } elseif($mes == "Pro") {$mesic = mysql_fetch_array(mysql_query("SELECT * FROM poc_mesic WHERE mesic='".$rok."-12-00'")); return $mesic['pocet']; } }

$data = array( "Led" => mesic('Led'), "Úno" => mesic('Úno'), "Bře" => mesic('Bře'), "Dub" => mesic('Dub'), "Kvě" => mesic('Kvě'), "Čen" => mesic('Čen'), "Čec" => mesic('Čec'), "Srp" => mesic('Srp'), "Zář" => mesic('Zář'), "Říj" => mesic('Říj'), "Lis" => mesic('Lis'), "Pro" => mesic('Pro') );

$width = 480; $height = 250; $image = imagecreate($width, $height); /* Výška a šířka grafu */

$white = imagecolorallocate($image, 255, 255, 255); /* Bílé pozadí */ $navy = imagecolorallocate($image, 84, 140, 93); /* Zelené grafy */ $black = imagecolorallocate($image, 51, 51, 51); /* Černé orámovaní */ $gray = imagecolorallocate($image, 183, 183, 183); /* Šedé orámovaní */

$maxval = max($data); $nval = sizeof($data);

$vmargin = 20; $hmargin = 38;

$base = floor(($width-$hmargin) / $nval);

$ysize = $height-2 * $vmargin; $xsize = $nval * $base;

$titlefont = 3; $title = "Měsíční statistika za rok ".$rok; /* Nadpis grafu */ $txtsz = imagefontwidth($titlefont) * strlen($title); $xpos = (int)($hmargin + ($xsize-$txtsz)/2); $xpos = max(1, $xpos); $ypos = 3; imagestring($image, $titlefont, $xpos, $ypos, $title, $black);

$labelfont = 2; $ngrid = 6;

$dydat = $maxval / $ngrid; $dypix = $ysize / ($ngrid +1);

for($i = 0; $i <= ($ngrid +1); $i++) { $ydat = (int)($i * $dydat);

$ypos = $vmargin + $ysize-(int)($i*$dypix);

$txtsz = imagefontwidth($labelfont) * strlen($ydat); $txtht = imagefontheight($labelfont);

$xpos = (int)(($hmargin-$txtsz) / 2); $xpos = max(1, $xpos);

imagestring($image, $labelfont, $xpos, $ypos-(int)($txtht/2), $ydat, $black);

if(!($i == 0) && !($i > $ngrid)) { imageline($image, $hmargin-3, $ypos, $hmargin + $xsize, $ypos, $gray); } }

$padding = 3; $yscale = $ysize / (($ngrid+1) * $dydat);

for($i = 0; list($xval, $yval) = each($data); $i++) { $ymax = $vmargin + $ysize; $ymin = $ymax-(int)($yval*$yscale); $xmax = $hmargin + ($i+1)*$base-$padding; $xmin = $hmargin + $i*$base + $padding; imagefilledrectangle($image, $xmin, $ymin, $xmax, $ymax, $navy);

$txtsz = imagefontwidth($labelfont) * strlen($xval); $xpos = $xmin + (int)(($base-$txtsz) / 2); $xpos = max($xmin, $xpos); $ypos = $ymax + 3; imagestring($image, $labelfont, $xpos, $ypos, $xval, $black); /* Počet návštěv nad grafy */ if(strlen($yval) == 1) {$center = 4;} elseif(strlen($yval) == 2) {$center = 1;} elseif(strlen($yval) == 3) {$center = -2;} elseif(strlen($yval) == 4) {$center = -5;} else {$center = -8;} imagestring($image, $labelfont, $xpos+$center, $ymin-13, $yval, $black); }

imagerectangle($image, $hmargin, $vmargin, $hmargin + $xsize, $vmargin + $ysize, $black);

header("Content-type: image/jpeg"); imagejpeg($image); imagedestroy($image); ?>

A nyní už stáčí v HTML zobrazit graf jako obrázek:

<img src="/graf.php" alt="Měsíční statistika za letošní rok">

Barvy grafu si můžete upravit, ale jen v hexadecimální definici a pokud znáte barvy jen v RGB, tak doporučují program ColSel, který umí převádět RGB barvy do HEX. Závěrem už jen přejí, ať vám graf slouží a ukazuje velké hodnoty.

***** ø 2.9 (734 hlasů) ≈ Návratnost
(Podrobné statistiky ná...) « Starší článek | Novější článek » (Beats of Rage - městsk...)

Štítky: PHP, tutoriál, zobrazit všechny štítky
! Našli jste v článku gramatické či pravopisné chyby? Je to z důvodu autorovy nemoci zvané dysgrafie. Tudíž všem děkuji za pochopení a každý článek pokud možno nechávám projít korekturou. !

Zatím 22 komentářů

web - reaguj - #438Pajahv Ne, 13. leden 2008, 12:13
avatar

Další článek, který využiju. :-)

Opera 9.25 / Windows XP
web - reaguj - #439DJMikyv Ne, 13. leden 2008, 12:44
avatar

if, elseif, elseif, elseif, elseif, elseif… Switch známe? *1*

Firefox 2.0.0.11 / Windows XP
web - reaguj - #440DJMikyv Ne, 13. leden 2008, 12:49
avatar

Ještě dodatek – lepší by snad bylo použít na obrázek PNG a ne JPG.

Firefox 2.0.0.11 / Windows XP
web - reaguj - #441CrazyDog mužv Ne, 13. leden 2008, 18:34
avatar

DJMiky: Já vím. Nějak jsem si na to elseif zvykl :). To je moje temná stránka…
{17} To jsem rád. *5*

Firefox 2.0.0.11 / Ubuntu Linux
web - reaguj - #442Pajahv Út, 15. leden 2008, 13:06
avatar

CrazyDog: ale ten png by jsi tam mohl dát, png má hezky vykreslený text, jpeg má kolem textu šum. PNG je menší a má celkově lepší kvalitu. ;-)

Opera 9.25 / Windows XP
web - reaguj - #443CrazyDog mužv Út, 15. leden 2008, 14:44
avatar

Kdo to chce mít v PNG, tak ať místo

header("Content-type: image/jpeg");
imagejpeg($image);
header("Content-type: image/png");
imagepng($image);
Je to ve spodku. *4*

Firefox 2.0.0.11 / Ubuntu Linux
web - reaguj - #449Antoniusv So, 19. leden 2008, 21:05
avatar

hele {1} a ty na tom bananu, pipni, nebo na cem ses nemas ani awstats? *6*

Opera 9.25 / Windows Vista
web - reaguj - #450CrazyDog mužv So, 19. leden 2008, 22:13
avatar

{9} To jsem teď nepochopil. Mám awstats a jsem na blueboard. Tohle je jen třešnička na dortu. A někdo nemá vůbec statistiky, tak se mu to hodí, ne?

Firefox 2.0.0.11 / Ubuntu Linux
web - reaguj - #452Antoniusv Ne, 20. leden 2008, 00:20
avatar

jo, to urcite, ale tak koukal jsem ze to mas i tady na webu, tak uz jsem nad tim premyslel drive *12*
btw jake tam jsou na blueboardu v awstats plug-iny? Teda nevim jestli se to sem hodi, kdyztak mi to smaz a napis do knihy navstev, jestli ne.

Opera 9.25 / Windows Vista
web - reaguj - #454CrazyDog mužv Ne, 20. leden 2008, 09:54
avatar

{9} S pluginy? Jako, že co to umí měřit nebo jestli tam jdou přidat další počitadla? *12*

Firefox 2.0.0.11 / Ubuntu Linux
web - reaguj - #455Antoniusv Út, 22. leden 2008, 14:45
avatar

{1} dole v AWSTATS mas napsanou jejich verzi a pluginy ktere AWSTATS maji, tak me zajima jake tam na Blueboardu jsou a co to umi. Jsou to rozsireni AWSTATS, stejne jako jsou plug-iny rozsireni treba do Firefoxu…

Opera 9.25 / Windows Vista
web - reaguj - #456CrazyDog mužv Út, 22. leden 2008, 15:07
avatar

{9} Pluginy tam nejsou vypsané, jen verze: Advanced Web Statistics 6.6 (build 1.887) Jinak to měří:

  • Souhrn
  • Za měsíc
  • Dny v měsíci
  • Dny v týdnu
  • Hodiny
  • Návštěvy domény/země
  • Hosté
  • Roboti
  • Trvání návštěv
  • Typ souboru
  • Stránky/URL
  • OS
  • Browsery (prohlížeče)
  • Přístup z
  • - Odkaz z Internetového vyhledávače
  • - Přímá adresa / Oblíbené (Bookmark)
  • - Odkaz z diskuzních skupin (News)
  • - Odkaz z jiné stránky (jiné stránky než vyhledávače)
  • Hledaná slovní spojení
  • Hledané výrazy
  • Oblíbené (odhad)
  • Chybové kódy HTTP

A to je asi tak vše…

Firefox 2.0.0.11 / Ubuntu Linux
web - reaguj - #458Antoniusv Út, 22. leden 2008, 19:23
avatar

{1} aha, takze jen nejaky zaklad starsi verze. Ja mam Advanced Web Statistics 6.7 (build 1.892) - Created by awstats (plugins: hostinfo, ipv6, graphapplet, geoip, decodeutfkeys, tooltips) u martina na Pondu *5* - doporucuju, ja tam presouvam postupne vsechno *21* AWSTATS tam maji uz i utf, takze se ti zobrazujou klicova slova, atd. spravne a ne s klikihaky, jako driv *5*

Opera 9.25 / Windows Vista
web - reaguj - #497zaachive St, 12. březen 2008, 17:54
avatar

Ajaj. chudina databaze tohle zpracovavat.
Copak by vsechny ty dotazy nesly nacpat do jednoho a ne delat zbytecne tolik dotazu? Nebo alespon ty dotazy trosinku optimalizovat.
Proc prenaset cely obsah radku z SQL serveru na Webovy server, kdyz stejne ve vysledku chces jenom soucet radek? :-)
A ani webovemu serveru nezavidim, zpracovavat ty IF-else IF-else IF.
A kdyz se divam sem pod tuhle textareu, do ktere pisu komentar, a vidim ze doba vygenerovani stranky byla 0.5 sekundy, tak se ani moc nedivim.

Firefox 2.0.0.12 / Windows Vista
web - reaguj - #498CrazyDog mužve St, 12. březen 2008, 19:45
avatar

zaachi: IF je náhodou rychlejší než switch ale jinak když kliknu na statistiky dole, kde se všechny vypíšou, tak je to max. 0,04… a optimalizované to je akorát tím, že se zápis provádí jen jednou za den pro jednoho uživatele.

Firefox 2.0.0.12 / Ubuntu Linux
reaguj - #505martin-vevve St, 19. březen 2008, 17:06
avatar

Narazil jsem na tento clanek uplne nahodou, a po precteni jsem byl opravdu zdesen. Nedalo mi to a upravil jsem ti prvni dva bloky kodu alespon takto.. dal uz to radeji nebudu rozebirat. ber to jako inspiraci a podivej se, proc je tvoje if-else metoda spatna (a ten tvuj argument se switch bezvyznamny). snad se tady kod zobrazi dobre

function mesic($mes) {
 include("./db.php"); /* přístup k databázi*/
 $mesic = mysql_fetch_assoc(mysql_query("SELECT pocet FROM poc_mesic WHERE mesic='".date("Y")."-".(int)$mes."-00'"));
 return $mesic['pocet'];
}

$data = array( "Led" => mesic(1), "Úno" => mesic(2), "Bře" => mesic(3), "Dub" => mesic(4), "Kvě" => mesic(5), "Čen" => mesic(6), "Čec" => mesic(7), "Srp" => mesic(8), "Zář" => mesic(9), "Říj" => mesic(10), "Lis" => mesic(11), "Pro" => mesic(12) );

Firefox 2.0.0.12 / Windows Vista
web - reaguj - #506CrazyDog mužve St, 19. březen 2008, 20:49
avatar

martin-vev: To máš pravdu… Já neměl čas zjišťovat lepší řešení. Tohle je takové amatérsky napsané. Ale díky, že jsi na to upozornil.

Firefox 2.0.0.12 / Ubuntu Linux
reaguj - #518martin-vevv So, 5. duben 2008, 19:54
avatar

nojo nikdo nema na nic cas a podle toho pak ty weby vypadaji :)

Firefox 2.0.0.13 / Windows Vista
reaguj - #940Bobikos mužv So, 14. srpen 2010, 19:11
avatar

Zdraví, bohužel ale tento script podle všeho nefunguje, graf(nebo-li samotný obrázek) se mi nevykreslí, žádnou chybu mi PHP nevyhazuje, mohl by ses na ten scipt prosím tě podívat?

Chrome 5.0.375.126 / Windows XP
web - reaguj - #976lopik mužve St, 22. září 2010, 11:33
avatar

Zdravím. Graf jaksi nefunguje, nevypisuje ani žádnou chybu, vypisuje chybnou diakritiku. Co s tím může být?

Opera 9.80 / Windows 7
web - reaguj - #977CrazyDog mužve Čt, 23. září 2010, 14:41
avatar

lopik: Podívám se na to co nejdříve to půjde.

Chrome 6.0.472.55 / Linux
web - reaguj - #978lopik mužve Čt, 23. září 2010, 23:37
avatar

CrazyDog: Ok, pak dej vědět.

Opera 9.80 / Windows 7
 
0/2000
Jméno*
Web
Email
Gravatar
avatar
  [f] [:)] [L] [XL] [XXL] | [b] [i] [s] [e] [*] [cite] [code] [kod] [h1] [h2] [abbr] [sup] [sub] |
 
nejoblíbenější články:
novinky na webu:
informace: