Statistika přístupů v PHP – odkud přicházejí návštěvníci
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_Referer
v config.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.
Mohlo by vás také zajímat
-
Jak se chránit před podvody na internetu – část 1
8. října 2024 -
Jak lze snadno upravovat soubory v PDF?
14. září 2023 -
Jak se chránit před podvody na internetu – část 2
14. října 2024 -
Nepodceňte UX na vašem webu: Proč na něm záleží?
10. dubna 2024
Nejnovější
-
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024 -
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024