Navigace

Hlavní menu

 

Submenu

 

Statistika přístupů v PHP – hodinová a denní návštěvnost

Pokud se již nedočkavě ohlížíte po konci cesty k vlastním statistikám, dočkáte se již v příštím díle. V tom předposledním připravíme statistiku přístupů v jednotlivých hodinách (0 až 23) a dnech (Pondělí až Neděle). Kromě toho si řekneme, jak vytvořit statistiku přístupů jednotlivých stránek našeho serveru.

Hotovou aplikaci si můžete prohlédnout a vyzkoušet. V ukázkové verzi se provádí statistika přístupů stránek www.czechia.cz/help.

Hodinová návštěvnost

Hodinová návštěvnost vyjadřuje počet přístupů v jednotlivých hodinách, tedy např. mezi 00:00:00 a 00:59:59 či 14:00:00 a 14:59:59. K vytvoření této statistiky nepotřebujeme žádnou zvláštní SQL tabulku, vystačíme si pouze s tabulkou access a položkou access_date, která obsahuje datum a čas přístupu. Podíl přístupů na celkovém počtu přístupů budeme za každou hodinu vyjadřovat i graficky, proto musíme znát počet přístupů v nejvíce zastoupené hodině. K tomu je třeba použít dva podobné cykly. V prvním cyklu postupně zjišťujeme počet přístupů v jednotlivých hodinách (0 až 23) a zároveň si s percentuelním podílem obě hodnoty ukládáme do dvou polí. Za zmínku stojí snad jen použití SQL příkazu HOUR, který z daného času vrátí hodinu. V druhém cyklu počítáme šířky obrázků znázorňujících podíl jednotlivých hodin a statistiku zapisujeme do tabulky.

// HODINOVÁ NÁVŠTĚVNOST
for($i=0;$i<=23;$i++):
    $query = MySQL_Query("SELECT count(*) FROM access WHERE HOUR(access_date) = '$i' AND $sql_access_date");
    $result = MySQL_Fetch_Array($query);
    $hourly_pageviews[$i] = $result["count(*)"]; // počet přístupů v jednotlivých hodinách
    $rate_pageviews[$i] = BCDiv($result["count(*)"], ($pageviews/100), 2); // podíl v procentech
endfor;

echo '<p align="center" class="heading">Návštěvnost v hodinách</p>';
echo '<table width="430" cellspacing="0" align="center">';
echo '<tr><td width="50" class="tableheader">Hodina</td><td width="50" class="tableheader">Počet</td><td width="330" class="tableheader">Podíl</td>';

$max = Max($hourly_pageviews); // počet přístupů v nejvíce zastoupené hodině

for($i=0;$i<=23;$i++):
    $width = Round($hourly_pageviews[$i]/$max*250); // šířka obrázku znázorňujícího podíl
    echo '<tr><td>' . $i . '</td><td>' . $hourly_pageviews[$i] . '</td><td><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate_pageviews[$i] . ' %</td></tr>';
endfor;

echo '</table><br>';

Denní návštěvnost

Denní návštěvnost vyjadřuje počet přístupů v jednotlivých dnech, např. v pondělky, úterky, atd. Tuto statistiku vytvoříme obdobně jako statistiku hodinové návštěvnosti. SQL příkaz WEEKDAY vrací číslo dne v týdnu (0 = Pondělí, 1 = Úterý atd.).

// DENNÍ NÁVŠTĚVNOST
for($i=0;$i<=6;$i++):
    $query = MySQL_Query("SELECT count(*) FROM access WHERE WEEKDAY(access_date) = '$i' AND $sql_access_date");
    $result = MySQL_Fetch_Array($query);
    $daily[$i] = $result["count(*)"];
    $rate_daily[$i] = BCDiv($result["count(*)"], ($pageviews/100), 2);
endfor;

echo '<p align="center" class="heading">Návštěvnost ve dnech</p>';
echo '<table width="430" cellspacing="0" align="center">';
echo '<tr><td width="50" class="tableheader">Den</td><td width="50" class="tableheader">Počet</td><td width="330" class="tableheader">Podíl</td>';

$max = Max($daily);
$days = Array("Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle");

for($i=0;$i<=6;$i++):
    $width = Round($daily[$i]/$max*250);
    echo '<tr><td>' . $days[$i] . '</td><td>' . $daily[$i] . '</td><td><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate_daily[$i] . ' %</td></tr>';
endfor;

echo '</table><br>';

Statistika stránek

K vytvoření statistiky jednotlivých stránek našeho serveru budeme potřebovat tabulku path, kam budeme ukládat informace o stránkách.

CREATE TABLE path (
    id int(11) NOT NULL auto_increment,
    page tinytext,
    title tinytext,
    PRIMARY KEY (id)
);

  • id - unikátní označení každé stránky (primární klíč)
  • page - URL stránky
  • title - název stránky (z tagu <title>)

Ve skriptu, který je součástí souboru counter.php, musíme nejprve zjistit, jakou stránku si uživatel prohlíží. Protože počítadlo voláme jako obrázek, nemáme URL stránky v proměnné $REQUEST_URI, ale v proměnné $HTTP_REFERER. Poté, co URL převedeme na malá písmena, zjistíme, zda je stránka již v databázi. Pokud ne, do databáze ji přidáme. Ještě předtím se pokusíme zjistit název stránky, což je text mezi tagy <title> a </title>. Do proměnné $path vložíme id stránky a zároveň ho uložíme s ostatními údaji o daném přístupu do tabulky access.

// STRÁNKA
$request_uri = StrToLower($HTTP_REFERER); // převede na malá písmena

// je stránka v databázi ? (pokud ne, přidáme ji)
$query = MySQL_Query("SELECT id FROM path WHERE page = '$request_uri'");
if ($result = MySQL_Fetch_Array($query)):
    $path = $result["id"];
else:
    // název stránky
    $fp = FOpen($request_uri, "r");
    ERegI("<title>(.*)</title>", FRead($fp, 300), $title);
    FClose($fp);
    if($title[1]!="")
        $title = $title[1];
    else
        $title = 0;
    
    $query = MySQL_Query("INSERT INTO path VALUES ('', '$request_uri', '$title')");
    $path = MySQL_Insert_ID();
endif;

// do tabulky access vložíme informace o každém přístupu na stránku
$add = MySQL_Query("INSERT INTO access VALUES ('', '$date', '$visit', '$browser', '$os', '$resolution', '$depth', '$referer', '$path', '$area', '$ip', '$ip_name', '$domain')");

Závěrečné vyhodnocení zapíšeme do tabulky o třech sloupcích - Název stránky nebo URL, Počet shlédnutí této stránky, Podíl přístupů na tuto stránku na celkovém počtu přístupů. V SQL dotazu spojíme tabulky path a access, položka id v tabulce path je primární klíč, zatímco položka path v tabulce access je klíč cizí. Další postup, tj. výpočet podílu a šířky obrázku, byl komentován ve třetím dílu.

// STRÁNKY
echo '<p align="center" class="heading">Stránky</p>';
echo '<table width="680" cellspacing="0" align="center">';
echo '<tr><td width="250" class="tableheader">Název</td><td width="50" class="tableheader">Počet</td><td width="380" class="tableheader">Podíl</td>';

// vybíráme stránky podle jejich zastoupení
$query = MySQL_Query("SELECT page, title, count(*) AS count_it FROM path, access WHERE path.id = path AND $sql_access_date GROUP BY path.id ORDER BY count_it DESC");
$max = MySQL_Result($query, 0, "count_it"); // počet shlédnutí nejnavštěvovanější stránky
$move = MySQL_Data_Seek($query, 0); // přesuneme se znovu na začátek

while($result = MySQL_Fetch_Array($query)):
    $name = ($result["title"]!='0') ? $result["title"] : $result["page"]; // název stránky nebo URL
    $width = Round($result["count_it"]/$max*300); // šířka obrázku znázorňujícího podíl
    $rate = BCDiv($result["count_it"], ($pageviews/100), 2); // podíl v procentech
    echo '<tr><td>' . $name . '</td><td>' . $result["count_it"] . '</td><td><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate . ' %</td></tr>';
endwhile;

echo '</table><br>';

Tímto je statistika přístupů ukončena, zbývá nám již jen vytvoření kalendáře a právě o tom bude následující díl.

Předchozí díly:

Statistika přístupů v PHP – regionální lokalizace
Statistika přístupů v PHP – domény nejvyšší úrovně
Statistika přístupů v PHP – vyhledávací fráze
Statistika přístupů v PHP – odkud přicházejí návštěvníci
Statistika přístupů v PHP – rozlišení a barevná hloubka
Statistika přístupů v PHP – detekce operačního systému
Statistika přístupů v PHP – detekce prohlížeče
Statistika přístupů v PHP – počet unikátních návštěvníků

Kebrt, Michal (21. 8. 2002)
Diskuze: Statistika přístupů v PHP – hodinová a denní návšt ...
2002-08-23 10:32:21md.$request_uri = StrToLower($HTTP_REFERER...
2002-08-30 18:17:36Michal Kebrt$request_uri = StrToLower($HTTP_REFERE...
2002-09-11 06:53:40Jméno a příjmení$request_uri = StrToLower($HTTP_REFER...
2003-01-08 11:38:10Budtitle_
2003-01-08 18:38:38Michal Kebrttitle_
2003-01-08 11:45:06Budhlaseni chyby
2003-01-08 18:45:21Michal Kebrthlaseni chyby
2003-01-08 19:04:31Budhlaseni chyby
2003-01-08 20:21:02Budhlaseni chyby
2003-01-13 23:23:20Budhlaseni chyby
2003-01-19 19:16:25Budhlaseni chyby
2004-04-13 16:05:18martashlaseni chyby
2002-08-31 22:10:29MiraDotaz na autora
2002-09-01 12:28:29Michal KebrtDotaz na autora
2002-09-12 21:05:40MiraDotaz na autora
2002-09-15 16:31:41Michal KebrtDotaz na autora
2003-01-29 10:44:57Steepfunkce BCDiv nedoporucuji...