Navigace

Hlavní menu

 

Submenu

 

Statistika přístupů v PHP – regionální lokalizace

Regionální lokalizací navážeme na předchozí díl. Popíši, jak zjistíte kraj, okres, město či vysokou školu, ze které se návštěvník stránek připojuje. Krátce se zmíním i o zjištění poskytovatele připojení.

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.

Jediný způsob, jak provést regionální lokalizaci, je zpracování doménové adresy počítače, o které jsme hovořili již v minulém dílu. Celý postup je poměrně jednoduchý a podobá se například detekci prohlížeče. Doménovou adresu postupně porovnáváme s mnoha regulárními výrazy, které označují města nebo vysoké školy.

Tabulka region

Vzhledem k tomu, že kromě měst budeme vytvářet i statistiku krajů, potřebujeme dvě vzájemně propojené databázové tabulky region a town. V tabulce region bude všech 14 českých krajů, Slovensko a vysoké školy, které na internetu tvoří poměrně velkou komunitu.

CREATE TABLE region (
    id int(11) NOT NULL,
    name varchar(50),
    PRIMARY KEY (id)
);
  • id - unikátní označení každého kraje (primární klíč)
  • name - kraj

idname
0Ostatní
1Praha
2Středočeský kraj
3Jihočeský kraj
4Plzeňský kraj
5Karlovarský kraj
6Ústecký kraj
7Liberecký kraj
8Královéhradecký kraj
9Pardubický kraj
10Vysočina
11Jihomoravský kraj
12Zlínský kraj
13Olomoucký kraj
14Moravskoslezský kraj
15Vysoké školy
16Slovensko

Tabulka town

V tabulce town budou informace o městech (okresech), vysokých školách, apod. Vytvoříme ji pomocí tohoto SQL dotazu:

CREATE TABLE town (
    id int(11) NOT NULL,
    name varchar(70),
    ip_regexp varchar(70),
    region int(11),
    PRIMARY KEY (id)
);
  • id - unikátní označení každého města, VŠ, … (primární klíč)
  • name - město
  • ip_regexp - regulární výraz odpovídající danému městu
  • region - označení kraje (cizí klíč), obsahuje primární klíče z tabulky region

Soubor, ze kterého jsem při vytváření tabulky town vycházel, obsahuje několik stovek různých doménových adres. Pokud byste si ho chtěli prohlédnout, a případně si seznam měst a dalších subjektů rozšířit, můžete si jej stáhnout. Krátký výtah z tohoto souboru obsahuje následující tabulka:

ppp250.hk.worldonline.czolcD001.nextra.cz
ppp96.brno.worldonline.czta005.velkemezirici.czech.net
ppp151.mb.worldonline.czkxchav07.vse.cz
ostravaa-162.dialup.vol.cza6-22.natur.cuni.cz
varya-61.dialup.vol.czdial1-041.ba.nextra.sk
ustia-147.dialup.vol.czdiamant.sjf.tuke.sk

Klíčová je položka ip_regexp, ve které jsou regulární výrazy detekující města či vysoké školy. Každý poskytovatel připojení používá v doménových adresách různé zkratky měst a krajů, proto se u některých měst objeví v položce ip_regexp hned několik regulárních výrazů oddělených metaznakem "|". Regulární výraz ".*" označuje libovolný řetězec. Chceme-li použít metaznak v jeho původním významu, musíme před něj napsat "\". U delších názvů měst (například ostrava.worldonline.cz) stačí zapsat pouze název města (ostrava), u krátkých zkratek (například na.worldonline.cz) je dobré uvést celou adresu, aby nedošlo k chybné detekci. V uvedeném příkladu by to mohlo být třeba u adresy isslanstr.snake.cz.

V závěru tabulky town (od id 201) je několik největších poskytovatelů připojení, u kterých se detekce města, vzhledem k tvaru jejich doménových adres, nedá provést. Na samém konci (od id 301) je pak několik nejdůležitějších domén třetí úrovně. Všechny tyto údaje (od id 201) se sice netýkají vlastní regionální lokalizace, ale jsou uvedeny spíše jako příklad, jak zjistit poskytovatele připojení, jehož služby návštěvník využívá, případně další subjekty, které navštěvují naše stránky.

idnameip_regexpregion
0Ostatní0
1Hradec Královéhk\.worldonline\.cz|hradec|hrk.*nextra\.cz8
2Brnobrno|brn.*nextra\.cz11
3Mladá Boleslavmb\.worldonline\.cz|boleslav2
4Prahapraha|pha\.gts\.cz|phu.*nextra\.cz1
5Ostravaostrava|ova.*nextra\.cz14
6Kladnokladno2
7Tábortabor3
8Karlovy Varyvary|kva.*nextra\.cz5
9Plzeňplzen|plz.*nextra\.cz4
10Pardubicepce\.worldonline\.cz|pardubice9
11České Budějovicecb\.worldonline\.cz|budejice3
12Opavaopava14
13Třinectrinec14
14Ústí nad Labemusti.*vol\.cz|ul\.worldonline\.cz6
15Náchodna\.worldonline\.cz8
16Velké Meziříčívelkemezirici10
17Tepliceteplice6
18Ústí nad Orlicíuo\.worldonline\.cz9
19Olomoucolomouc|olc.*nextra\.cz13
20Rychnov nad Kněžnourychnov8
21Znojmoznojmo11
22Děčíndecin6
23Přerovprerov13
24Liberecliberec|lbc.*nextra\.cz7
25Ždár nad Sázavouzdar10
26Příbrampribram2
27Chomutovchomutov6
28Písekpisek3
29Břeclavbreclav11
30Kroměřížkromeriz12
31Zlínzlin12
32Poličkapolicka9
33Sokolovsokolov5
34Havlíčkův Brodhb\.worldonline\.cz10
35Jablonec nad Nisoujablonec7
36Jihlavajihlava10
37Třebíčtrebic10
38Kutná horakutnahora2
39Trutnovtrutnov8
40Chrudimchrudim9
41Šumperksumperk13
42Krnovkrnov14
43Chebcheb5
44Kyjovkyjov11
45Brandýs nad Labembrandys2
46Prostějovprostejov13
47Sušicesusice4
48Vsetínvsetin12
49VUT Brnovutbr\.cz15
50UK Prahacuni\.cz15
51ČVUT Prahacvut\.cz15
52VŠE Prahavse\.cz15
53VŠB TU Ostravavsb\.cz15
54ZČU Plzeňzcu\.cz15
55MU Brnomuni\.cz15
57Mendelova uni. Brnomendelu\.cz15
58JČUjcu\.cz15
59TU Liberecvslib\.cz15
60UHKuhk\.cz15
61Univerzita Pardubiceupce\.cz15
62ČZU Prahaczu\.cz15
63Uni. Palackého - Olomoucupol\.cz15
64Uni. J. E. Purkyně - ULujep\.cz15
65VŠCHT Prahavscht\.cz15
67Ostravská univerzitaosu\.cz15
68VŠ vojenská Vyškovvvs-pv\.cz15
69Vojenská akademie Brnovabo\.cz15
70Vojenská lék. ak. JEP - HKpmfhk\.cz15
71Slezská u. Opavaslu\.cz15
72Košiceke\.nextra\.sk16
73Bratislavaba\.nextra\.sk16
74TU Košicetuke\.sk16
75Mostmost6
76Česká Lípalipa7
77Uni. P. J. Šafárika Košiceupjs\.sk16
78Uni. Komenského Bratislavauniba\.sk16
79Zvolenzv\.nextra\.sk16
80Trnavatt\.nextra\.sk16
81Žilinaza\.nextra\.sk16
82Nitranr\.nextra\.sk16
83Popradpo\.nextra\.sk16
84Trenčíntn\.nextra\.sk16
85Martinmt\.nextra\.sk16
201Contactel (cz)contactel\.cz0
202IOL (cz)iol\.cz0
203PVT Net (cz)pvtnet\.cz0
204CZ Com (cz)czcom\.cz0
205TELE2 (cz)tele2\.cz0
206Telecom (sk)telecom\.sk0
207Globtelnet (sk)globtelnet\.sk0
208PVT (sk)pvt\.sk0
209Kiwwi (sk)kiwwi\.sk0
210Mistral (UPC)mistral\.cz0
301Ostatní CZ\.cz0
302Ostatní SK\.sk0
303Ostatní COM\.com0
304Ostatní NET\.net0

Skript, který provede detekci města, je poměrně krátký a jednoduchý. Z minulého dílu připomenu, že doménová adresa se nachází v proměnné $ip_name. V SQL dotazu, který porovnává doménovou adresu s regulárními výrazy, použijeme příkaz REGEXP, o kterém jsem se zmiňoval již v druhém dílu tohoto seriálu. Příkaz ORDER BY id je použit kvůli tomu, že v tabulce town postupně přecházíme od konkrétnímu k obecnému (města -> poskytovatelé připojení -> domény třetí úrovně). Někdy se může stát, že doménová adresa odpovídá třeba dvěma záznamům. Z tohoto důvodu je použito omezení LIMIT 0,1. Proměnná $area, do které vložíme id města, bude součástí SQL dotazu, který do tabulky access uloží veškeré informace o každém přístupu.

// OBLAST
// odpovídá doménová adresa nějakému záznamu v databázi ?
if($ip_name!="0"):
    $query = MySQL_Query("SELECT id FROM town WHERE '$ip_name' REGEXP ip_regexp ORDER BY id LIMIT 0,1");
    if ($result = MySQL_Fetch_Array($query))
        $area = $result["id"];
    else
        $area = 0;
else:
    $area = 0;
endif;

Vyhodnocení

Statistiku zapíšeme do tabulky o třech sloupečcích - Oblast (město nebo kraj), Počet přístupů z této oblasti, Podíl přístupů z této oblasti na celkovém počtu přístupů. Statistika krajů a měst se od vyhodnocení jiných statistických údajů liší tím, že v prvním SQL dotazu, který zjišťuje počet přístupů z jednotlivých krajů, spojujeme tři tabulky region, town a access. Na první pohled může podmínka spojující 3 tabulky vypadat krkolomně, ale pokud si uvědomíte vztahy mezi tabulkami (primární a cizí klíče) znázorněné v prvním článku, je vše jasné. V druhém SQL dotazu zjišťujícím počet přístupů z měst nacházejících se v daném kraji nesmíme zapomenout na podmínku WHERE town.region = '$id', kde $id je právě zpracovávaný kraj. Další postup, tj. výpočet podílu a šířky obrázku, byl komentován ve třetím dílu.

// OBLAST
echo '<p align="center" class="heading">Kraje, města, oblasti</p>';
echo '<table width="680" cellspacing="0" align="center">';
echo '<tr><td width="150" class="tableheader">Oblast</td><td width="50" class="tableheader">Počet</td><td class="tableheader" width="480">Podíl</td class="tableheader">';

// vybíráme kraje podle jejich zastoupení
$query = MySQL_Query("SELECT region.id AS id, region.name AS name, count(*) AS count_it FROM region, town, access WHERE area = town.id AND town.region = region.id AND $sql_access_date GROUP BY region.id ORDER BY count_it DESC");
$max = MySQL_Result($query, 0, "count_it"); // počet přístupů z nejvíce zastoupeného kraje
$move = MySQL_Data_Seek($query, 0); // přesuneme se znovu na začátek

while($result = MySQL_Fetch_Array($query)):
    $rate = BCDiv($result["count_it"], ($pageviews/100), 2); // šířka obrázku znázorňujícího podíl
    $width = Round($result["count_it"]/$max*400); // podíl v procentech
    echo '<tr><td class="tableheader">' . $result["name"] . '</td><td class="tableheader">' . $result["count_it"] . '</td><td class="tableheader"><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate . ' %</td></tr>';
    
    $id = $result["id"]; // id právě zpracovávaného kraje
    
    // vybíráme města podle jejich zastoupení
    $query2 = MySQL_Query("SELECT town.name AS name, count(*) AS count_it FROM town, access WHERE area = town.id AND town.region = '$id' AND $sql_access_date GROUP BY town.id ORDER BY count_it DESC");    
    while($result = MySQL_Fetch_Array($query2)):
        $width = Round($result["count_it"]/$max*400);    // šíř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>' . $result["name"] . '</td><td>' . $result["count_it"] . '</td><td><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate . ' %</td></tr>';
    endwhile;
endwhile;

echo '</table><br>';

V příštím dílu se dozvíte, jak vytvořit statistiku hodinové (0-23) a denní (Po-Ne) návštěvnosti. K tomu si přidáme ještě statistiku jednotlivých stránek našeho serveru.

Předchozí články:
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 (1. 8. 2002)
Diskuze: Statistika přístupů v PHP – regionální lokalizace
2002-08-01 10:01:29Marek JelenStahnuti
2002-08-01 10:01:31Marek JelenStahnuti
2002-08-01 14:39:41Marek ŠalandaStahnuti
2002-08-04 18:48:01MirekCely skript
2002-08-04 20:57:04Michal KebrtCely skript
2002-08-20 16:08:21Michal TerčPokračování
2002-08-27 16:21:56LeoJe to sice pekne...
2002-08-30 18:25:01Michal KebrtJe to sice pekne...