Statistika přístupů v PHP – odkud přicházejí návštěvníci

28. února 2004

V tomto článku opustíme pátrání po technických informacích o uživateli a jeho prohlížeči a povíme si, jak zjistit, ze kterých stránek k nám návštěvníci přicházejí.

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

Ke zjištění odkud k nám návštěvníci přicházejí, využijeme HTTP hlavičku Referer – ta obsahuje URL stránky, ze které uživatel přišel na aktuální stránku. V PHP je obsah této hlavičky v proměnné $_SERVER['HTTP_REFERER']. Musíme si však uvědomit, že počítadlo vkládáme do stránek jako obrázek, a proto tato proměnná neobsahuje URL stránky, ze které uživatel přišel, nýbrž URL aktuální stránky. Jak bylo naznačeno již v předchozím článku, musíme použít JavaScript a obrázek (counter.php) vkládat s několika parametry. Parametr referer bude obsahovat URL stránky, ze které uživatel přišel na aktuální stránku. Tuto hodnotu, která se nachází v top.document.referrer, musíme pomocí funkce escape() zakódovat tak, aby byla bezpečně použitelná v URL. JavaScriptová funkce escape() pracuje obdobně jako PHP funkce urlencode(). O dalších parametrech již byla řeč v minulém článku.

<script language=“JavaScript“ type=“text/javascript“>
<!–
document.write(„<img src=\“__vas_server__/counter.php?referer=“ + escape(top.document.referrer) + „&screenres=“ + screen.width + „x“ + screen.height + „&colordepth=“ + screen.colorDepth + „\“ width=\“1\“ height=\“1\“ alt=\“\“>“);
// –>
</script>

Tabulka referer

Do tabulky referer budeme ukládat stránky (servery), ze kterých návštěvníci na naše stránky přicházejí. Tabulku vytvoříme pomocí tohoto SQL dotazu:

CREATE TABLE referer (
  id int(11) NOT NULL auto_increment,
  server varchar(50) NOT NULL,
  PRIMARY KEY (id)
);

  • id – unikátní označení každého serveru (primární klíč)
  • server – adresa serveru, ze kterého přicházejí

Do tabulky vložíme i dva základní záznamy, o kterých se za chvíli zmíním.

INSERT INTO referer VALUES (1, ‚Přímé volání‘);
INSERT INTO referer VALUES (2, ‚Přechod v rámci serveru‘);

URL stránky, ze které uživatel přišel ($_GET['referer']) musíme nejdřív zpětně pomocí funkce urldecode() dekódovat a převést na malá písmena, aby se v databázi neobjevovaly stejné stránky lišící se pouze velikostí písmen v URL. Kombinace funkcí escape() a urldecode() si ne vždy poradí se všemi českými znaky. Prozatím nás to však nemusí zajímat, více se dozvíte v příštím článku o vyhledávacích frázích.

Protože ne vždy přichází návštěvník z cizích stránek, musíme rozlišit celkem tři možnosti. Pokud je proměnná $http_referer prázdná, jedná se o přímé volání, což znamená, že uživatel zadal dané URL přímo do adresního řádku prohlížeče -> $referer = 1. Dále musíme rozlišit, zda se nejedná pouze o přechod mezi jednotlivými stránkami v rámci serveru. Do konstanty no_Refererconfig.php nejprve vložíme alespoň částečnou adresu našeho serveru. Pokud se no_Referer nachází v $http_referer, jedná se o přechod v rámci serveru -> $referer = 2. Jestliže nebyla splněna ani jedna podmínka, přišel návštěvník z cizích stránek.

// REFERER – odkud prisel navstevnik
$referer = 2; // predpokladame prechod v ramci serveru
if(isset($_GET[‚referer‘])) {
  // rozkoduje URL a prevede na mala pismena
  $http_referer = addslashes(urldecode(strtolower($_GET[‚referer‘])));
  if ($http_referer == “) { // prime volani
    $referer = 1;
  
  } elseif (eregi(no_Referer, $http_referer)) { // prechod v ramci serveru
    $referer = 2;

Nejprve stručně k tomu, jakým způsobem budeme provádět statistiku příchodů z cizích stránek. Jasnější to bude na příkladu. Máme tyto adresy, ze kterých návštěvníci přišli: http://interval.cz/r-article.asp?id=754, http://www.interval.cz/r-article.asp?id=351, http://diskuse.interval.cz/default.asp?idcategory=1. Protože celá adresa stránky, ze které uživatel přišel, nám příliš mnoho neřekne, budeme monitorovat jen doménové adresy stránek, z čehož vyplývá, že první návštěvník (http://interval.cz/r-article.asp?id=754) přišel z interval.cz. Protože část „www.“, jakožto doména třetí úrovně, nemá prakticky žádný vypovídací význam (server.cz je totéž, co www.server.cz), bude i 2. odkaz (http://www.interval.cz/r-article.asp?id=351) znamenat, že návštěvník přišel z interval.cz. U třetího odkazu (http://diskuse.interval.cz/default.asp?idcategory=1) je doménou třetí úrovně část „diskuse“, což nám říká, že se jedná nejspíš o nějakou diskusní část serveru interval.cz, a proto se bude jednat o přístup z diskuse.interval.cz. Pokud byste chtěli zjišťovat, z jakých konkrétních stránek daného serveru návštěvníci přicházejí, můžete tyto funkce samozřejmě odstranit nebo upravit.

Po trošku delší teorii přichází na řadu praktické řešení dané úlohy. URL ($http_referer) si nejprve rozdělíme na jednotlivé části pomocí funkce parse_url(). V poli s indexem host je poté doménová adresa (například www.interval.cz). Pole obsahuje celou řadu dalších užitečných informací – podrobnosti najdete v manuálu PHP. Následně odstraníme z adresy část „www“.

Pomocí známých funkcí a postupů zjistíme, zda daný server v tabulce referer již existuje. Pokud ne, tak ho samozřejmě přidáme. Do proměnné $referer si uložíme id daného serveru, tato proměnná bude součástí SQL dotazu, který uloží do tabulky access všechny informace o daném přístupu.

  } else { // navstevnik prisel z cizich stranek
    $url = parse_url($http_referer); // rozdeli URL na casti
    $host = eregi_replace(„^www\.“, „“, $url[‚host‘]); // odstrani „www.“
    // je stranka v databazi ? (pokud ne, pridame ji)
    $query = mysql_query(„SELECT id FROM referer WHERE server = ‚$host'“);
    if ($result = mysql_fetch_array($query)) {
      $referer = $result[‚id‘];
    } else {
      $query = mysql_query(„INSERT INTO referer VALUES (“, ‚$host‘)“);
      $referer = mysql_insert_id();
    }

Vyhodnocení

Statistika se bude skládat ze dvou tabulek. V první bude vyjádřen poměr přímých volání a přístupů z cizích serverů. V druhé potom přístupy z jednotlivých serverů. Počet přímých volání za dané období ($sql_access_date) zjistíme tak, že do SQL dotazu přidáme podmínku WHERE referer = 1. Při určování počtu přístupů ze všech cizích serverů použijeme podmínku WHERE referer > 2 (1 = přímé volání, 2 = přechod v rámci našeho serveru). Následně pomocí větší z obou hodnot ($max) a celkového počtu ($sum) vypočítáme šířku obrázku znázorňujícího podíl a samotný podíl v procentech. Tento postup je blíže popsán v článku o detekci operačního systému.

// PRIME VOLANI X PRISTUPY Z CIZICH STRANEK
// prime volani
$query = mysql_query(„SELECT count(id) FROM access WHERE referer = 1 AND $sql_access_date“);
$result = mysql_fetch_array($query);
$count_direct = $result[‚count(id)‘];
// pristupy z cizich stranek
$query = mysql_query(„SELECT count(id) FROM access WHERE referer > 2 AND $sql_access_date“);
$result = mysql_fetch_array($query);
$count_referer = $result[‚count(id)‘];
$max = max($count_direct, $count_referer); // maximalni hodnota (kvuli meritku)
$sum = $count_referer+$count_direct;
if($max != 0) {
  // sirky obrazku
  $width_direct = round($count_direct/$max*200);
  $width_referer = round($count_referer/$max*200);
  
  // podil
  $rate_direct = sprintf(‚%.2f‘, $count_direct/($sum/100));
  $rate_referer = sprintf(‚%.2f‘, $count_referer/($sum/100));
  
  echo ‚<h2>Přímé volání X přístupy z cizích stránek</h2>‘;
  echo ‚<table width=“550″ cellspacing=“0″>‘;
  echo ‚<tr><th>Typ</th><th>Počet</th><th>Podíl</th></tr>‘;
  
  echo ‚<tr><td>Přímé volání</td><td>‘ . $count_direct . ‚</td><td><img src=“1.gif“ width=“‚ . $width_direct . ‚“ height=“8″ alt=““ /> ‚ . $rate_direct .‘ %</td></tr>‘;
  echo ‚<tr><td>Odjinud</td><td>‘ . $count_referer . ‚</td><td><img src=“1.gif“ width=“‚ . $width_referer . ‚“ height=“8″ alt=““ /> ‚ . $rate_referer . ‚ %</td></tr>‘;
  
  echo „</table>\n\n“;
}

Výpis počtu přístupů z jednotlivých serverů provedeme spojením tabulek referer a access, kde položka id v tabulce referer je primárním klíčem a položka referer v tabulce access cizím klíčem. Podrobnější vysvětlení, byť se jedná o statistiku prohlížečů, najdete opět v již zmiňovaném článku o detekci operačního systému.

// REFERER
// vybirame servery podle jejich zastoupeni
$query = mysql_query(„SELECT server, count(referer) AS count_it FROM access JOIN referer ON (referer = referer.id) WHERE referer.id > 2 AND $sql_access_date GROUP BY referer ORDER BY count_it DESC“);
if(mysql_numrows($query) != 0) {
  echo ‚<h2>Z jakých stránek prišli</h2>‘;
  echo ‚<table width=“550″ cellspacing=“0″>‘;
  echo ‚<tr><th>Server</th><th>Pocet</th><th>Podíl</th></tr>‘;
  $max = mysql_result($query, 0, „count_it“); // pocet pristupu z nejvice zastoupeneho serveru
  $move = mysql_data_seek($query, 0); // presuneme se znovu na zacatek
  while($result = mysql_fetch_array($query)) {
    $width = round($result[‚count_it‘]/$max*200); // sirka obrazku znazornujiciho podil
    $rate = sprintf(‚%.2f‘, $result[‚count_it‘]/($count_referer/100)); // podil v procentech
    echo ‚<tr><td>‘ . $result[‚server‘] . ‚</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %>/td>>/tr>‘;
  }
  echo „</table>\n\n“;
}

V příštím článku, které do značné míry souvisí s tímto, se dozvíte, jak zjistit, které fráze používají návštěvníci stránek v různých vyhledávačích (Seznam, Atlas, Jyxo, Google a další).

Pozn. red.: Tento článek vyšel poprvé 20. 6. 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ší

Napsat komentář

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