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

8. května 2004

V tomto článku naši aplikaci rozšíříme o statistiku přístupů v jednotlivých hodinách (0 až 23) a dnech (pondělí až neděle). Kromě toho si ukážeme, jak vytvořit statistiku přístupů jednotlivých stránek serveru.

Hotovou aplikaci si můžete prohlédnout a vyzkoušet. V ukázkové verzi se provádí statistika přístupů stránek http://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říklad v rozmezí 00:00:00 až 00:59:59 či 14:00:00 až 14:59:59. Dobrou zprávou je, že 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. Protože podíl přístupů v každé hodině na celkovém počtu přístupů budeme vyjadřovat i graficky, musíme znát počet přístupů v nejvíce zastoupené hodině, a proto 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ň s percentuelním podílem si 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.

// HODINOVA NAVSTEVNOST
$max = 0; // maximalni hodinova hodnota
for($i = 0;$i <= 23;$i++) {
  $query = mysql_query(„SELECT count(id) FROM access WHERE HOUR(access_date) = ‚$i‘ AND $sql_access_date“);
  $result = mysql_fetch_array($query);
  $hourly_pageviews[$i] = $result[‚count(id)‘];
  $rate_pageviews[$i] = sprintf(‚%.2f‘, $result[‚count(id)‘]/($pageviews/100));
  if ($result[‚count(id)‘] > $max)
    $max = $result[‚count(id)‘];
}
echo ‚<h2>Návštěvnost v hodinách</h2>‘;
echo ‚<table width=“430″ cellspacing=“0″>‘;
echo ‚<tr><th>Hodina</th><th>Počet</th><th>Podíl</th></tr>‘;
for($i = 0;$i <= 23;$i++) {
  $width = round($hourly_pageviews[$i]/$max*250); // sirka obrazku znazornujiciho podil
  echo ‚<tr><td>‘ . $i . ‚</td><td>‘ . $hourly_pageviews[$i] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate_pageviews[$i] . ‚ %</td></tr>‘;
}
echo „</table>\n\n“;

Denní návštěvnost

Denní návštěvnost vyjadřuje počet přístupů v jednotlivých dnech, například v pondělky, úterky a podobně. 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ý…).

// DENNI NAVSTEVNOST
$max = 0;// maximalni denni hodnota
for($i = 0;$i <= 6;$i++) {
  $query = mysql_query(„SELECT count(id) FROM access WHERE WEEKDAY(access_date) = ‚$i‘ AND $sql_access_date“);
  $result = mysql_fetch_array($query);
  $daily[$i] = $result[‚count(id)‘];
  $rate_daily[$i] = sprintf(‚%.2f‘, $result[‚count(id)‘]/($pageviews/100));
  if ($result[‚count(id)‘] > $max)
    $max = $result[‚count(id)‘];
}
echo ‚<h2>Návštěvnost ve dnech</h2>‘;
echo ‚<table width=“430″ cellspacing=“0″>‘;
echo ‚<tr><th>Den</th><th>Počet</th><th>Podíl</th></tr>‘;
$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″ alt=““ /> ‚ . $rate_daily[$i] . ‚ %</td></tr>‘;
}
echo „</table>\n\n“;

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 varchar(250) NOT NULL,
  title tinytext NOT NULL,
  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é $_SERVER['REQUEST_URI'], ale v proměnné $_SERVER['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ň s ostatními údaji o daném přístupu ho uložíme do tabulky access.

// STRANKA
$request_uri = strtolower($_SERVER[‚HTTP_REFERER‘]); // prevede na mala pismena
// je stranka v databazi ? (pokud ne, pridame ji)
$query = mysql_query(„SELECT id FROM path WHERE page = ‚$request_uri'“);
if ($result = mysql_fetch_array($query)) {
  $path = $result[‚id‘];
} else {
  // nazev stranky
  $fp = fopen($request_uri, ‚r‘);
  eregi(„<title>(.*)</title>“, fread($fp, 1000), $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();
}

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, tedy výpočet podílu a šířky obrázku, byl komentován v článku o detekci operačního systému.

// STRANKY
// vybirame stránky podle jejich zastoupeni
$query = mysql_query(„SELECT page, title, count(path) AS count_it FROM access JOIN path ON (path.id = path) WHERE $sql_access_date GROUP BY path.id ORDER BY count_it DESC“);
if(mysql_num_rows($query) != 0) {
  echo ‚<h2>Stránky</h2>‘;
  echo ‚<table width=“680″ cellspacing=“0″>‘;
  echo ‚<tr><th>Název</th><th>Počet</th><th class=“width2″>Podíl</th></tr>‘;
  $max = mysql_result($query, 0, ‚count_it‘); // pocet shlednuti nejnavstevovanejsi stranky
  $move = mysql_data_seek($query, 0); // presuneme se znovu na zacatek
  while($result = mysql_fetch_array($query)) {
    $name = ($result[‚title‘]!=’0′) ? $result[‚title‘] : $result[‚page‘];// nazev stranky nebo URL
    $width = round($result[‚count_it‘]/$max*300); // sirka obrazku znazornujiciho podil
    $rate = sprintf(‚%.2f‘, $result[‚count_it‘]/($pageviews/100)); // podil v procentech
    echo ‚<tr><td>‘ . $name . ‚</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
  }
  echo „</table>\n\n“;
}

Pozn. red.: Tento článek vyšel poprvé 21. 8. 2002. Původní verze článku a k němu vedené diskuse jsou vám k dispozici v ZIP archivech.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Pavel Ř.

    Úno 23, 2021 v 10:26

    Chybí tu definice tabulky access, jinak to vypadá docela použitelně. A ještě bych dal mysqli místo mysql.

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *