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.
Š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. !
Další článek, který využiju. :-)
if, elseif, elseif, elseif, elseif, elseif… Switch známe?
Ještě dodatek – lepší by snad bylo použít na obrázek PNG a ne JPG.
DJMiky: Já vím. Nějak jsem si na to elseif zvykl :). To je moje temná stránka…
{17} To jsem rád.
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. ;-)
Kdo to chce mít v PNG, tak ať místo
header("Content-type: image/jpeg"); imagejpeg($image);dá
header("Content-type: image/png"); imagepng($image);Je to ve spodku.
hele {1} a ty na tom bananu, pipni, nebo na cem ses nemas ani awstats?
{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?
jo, to urcite, ale tak koukal jsem ze to mas i tady na webu, tak uz jsem nad tim premyslel drive
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.
{9} S pluginy? Jako, že co to umí měřit nebo jestli tam jdou přidat další počitadla?
{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…
{9} Pluginy tam nejsou vypsané, jen verze: Advanced Web Statistics 6.6 (build 1.887) Jinak to měří:
A to je asi tak vše…
{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 - doporucuju, ja tam presouvam postupne vsechno AWSTATS tam maji uz i utf, takze se ti zobrazujou klicova slova, atd. spravne a ne s klikihaky, jako driv
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.
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.
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) );
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.
nojo nikdo nema na nic cas a podle toho pak ty weby vypadaji :)
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?
Zdravím. Graf jaksi nefunguje, nevypisuje ani žádnou chybu, vypisuje chybnou diakritiku. Co s tím může být?
lopik: Podívám se na to co nejdříve to půjde.