Navigace

Hlavní menu

 

Submenu

 

Statistika přístupů v PHP – domény nejvyšší úrovně

Začneme pracovat s doménovou adresou a řekneme si, jak zjistit doménu nejvyšší úrovně (cz, sk, com, atd.), tedy stát, ze kterého návštěvník pochází. Součástí článku je i SQL tabulka se všemi doménami nejvyšší úrovně a jejich českými názvy.

Podmínkou pro zjištění domény nejvyšší úrovně je znalost doménové adresy počítače, ze kterého přišel požadavek. Postup, který byl popsán v článku Jak vědět více o návštěvnících pomocí PHP, ještě jednou zopakuji.

Protože do tabulky access budeme ukládat i IP adresu počítače, uložíme si ji do proměnné $ip. Musíme však počítat s tím, že pokud $REMOTE_ADDR obsahuje IP proxy serveru, obsahuje (ne vždy) IP adresu počítače, ze kterého přišel požadavek, proměnná $HTTP_X_FORWARDED_FOR. Ta však může obsahovat několik adres oddělených čárkou, proto použijeme funkci Explode().

// IP ADRESA
if(IsSet($HTTP_X_FORWARDED_FOR)):
    $explode_ip = Explode(",", $HTTP_X_FORWARDED_FOR);
    $ip = $explode_ip[0];
else:
    $ip = $REMOTE_ADDR;
endif;

Následně můžeme zjistit i doménovou adresu. V proměnné $REMOTE_HOST je však doménová adresa obsažena jen velmi zřídka. Proto použijeme funkci GetHostByADDR(), která převádí IP adresu na adresu doménovou. Aby se nám s doménovou adresou pracovalo lépe, převedeme ji na malá písmena. Pomocí dvou podmínek ještě otestujeme, zda se skutečně jedná o doménovou adresu. Komentář si zaslouží snad jen druhá podmínka zjišťující, zda se podařilo IP adresu převést na adresu doménovou. Využijeme k tomu regulární výraz testující, jestli má proměnná $ip_name tvar IP adresy, tj. XXX.XXX.XXX.XXX, kde X je libovolné číslo. V každé části oddělené tečkou musí být alespoň jedno číslo.

// DOMÉNOVÁ ADRESA
if($REMOTE_HOST!=""):
    $ip_name = $REMOTE_HOST;
else:
    $ip_name = GetHostByADDR($ip);
endif;

$ip_name = StrToLower($ip_name);

if($ip_name == "") $ip_name = 0;
// pokud se nepodařilo IP adresu převést na doménovou adresu, vložíme do $ip_name "0"
if(EregI("[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}", $ip_name))    $ip_name = 0;

Tabulka domain

V tabulce budou informace o všech existujících doménách nejvyšší úrovně, včetně jejich českého popisu. SQL dotaz, který vytvoří tabulku domain, vypadá následovně.

CREATE TABLE domain (
    id int(11) NOT NULL,
    code varchar(10),
    description varchar(50),
    PRIMARY KEY (id)
);
  • id - unikátní označení každé domény (primární klíč)
  • code - doména (např. cz, com, info)
  • description - popis domény, většinou stát

Tabulka domain je uvedena níže. Pokud se vám tato SQL tabulka bude hodit i v jiných aplikacích, můžete si ji stáhnout jako samostatný soubor.

idcodedescription
0??Nezjištěno
1acAscension (ostrov)
2adAndorra
3aeSpojené arabské emiráty
4afAfghánistán
5agAntigua a Barbuda
6aiAnguilla
7alAlbánie
8amArménie
9anNizozemské Antily
10aoAngola
11aqAntarktida
12arArgentina
13asAmerická Samoa
14atRakousko
15auAustrálie
16awAruba
17azÁzerbájdžán
18baBosna a Hercegovina
19bbBarbados
20bdBangladéš
21beBelgie
22bfBurkina
23bgBulharsko
24bhBahrajn
25biBurundi
26bjBenin
27bmBermudy
28bnBrunej
29boBolívie
30brBrazílie
31bsBahamy
32btBhútán
33bvBouvetův ostrov
34bwBotswana
35byBělorusko
36bzBelize
37caKanada
38ccKokosové ostrovy
39cdKongo - dem. republika
40cfStředoafrická republika
41cgKongo
42chŠvýcarsko
43ciCote d'Ivoire
44ckCookovy ostrovy
45clChile
46cmKamerun
47cnČína
48coKolumbie
49crKostarika
50cuKuba
51cvKapverdy
52cxVánoční ostrov
53cyKypr
54czČesko
55deNěmecko
56djDžibutsko
57dkDánsko
58dmDominika
59doDominikánská republika
60dzAlžírsko
61ecEkvádor
62eeEstonsko
63egEgypt
64ehZápadní Sahara
65erEritrea
66esŠpanělsko
67etEtiopie
68fiFinsko
69fjFidži
70fkFalklandy (Malvíny)
71fmFederativní státy Mikronésie
72foFaerské ostrovy
73frFrancie
74gaGabon
76gdGrenada
77geGruzie
78gfFrancouzská Guyana
79ggGuernsey
80ghGhana
81giGibraltar
82glGrónsko
83gmGambie
84gnGuinea
85gpGuadeloupe
86gqRovníková Guinea
87grŘecko
88gsJižní Georgie a Jižní Sandwichovy ostrovy
89gtGuatemala
90guGuam
91gwGuinea-Bissau
92gyGuyana
93hkHongkong
94hmHeardův ostrov a McDonaldovy ostrovy
95hnHonduras
96hrChorvatsko
97htHaiti
98huMaďarsko
99idIndonésie
100ieIrsko
101ilIzrael
102imMan (ostrov)
103inIndie
104ioBritské indickooceánské území
105iqIrák
106irÍrán
107isIsland
108itItálie
109jeJersey
110jmJamajka
111joJordánsko
112jpJaponsko
113keKeňa
114kgKyrgyzstán
115khKambodža
116kiKiribati
117kmKomory
118knSv. Kryštof a Nevis
119kpKorejská lidově dem. republika (KLDR)
120krKorejská republika
121kwKuvajt
122kyKajmanské ostrovy
123kzKazachstán
124laLaos
125lbLibanon
126lcSv. Lucie
127liLichtenštejnsko
128lkSrí Lanka
129lrLibérie
130lsLesotho
131ltLitva
132luLucembursko
133lvLotyšsko
134lyLibye
135maMaroko
136mcMonako
137mdMoldávie
138mgMadagaskar
139mhMarshallovy ostrovy
140mkMakedonie
141mlMali
142mmMyanmar
143mnMongolsko
144moMacao
145mpSeverní Mariany
146mqMartinik
147mrMauritánie
148msMontserrat
149mtMalta
150muMauricius
151mvMaledivy
152mwMalawi
153mxMexiko
154myMalajsie
155mzMosambik
156naNamibie
157ncNová Kaledonie
158neNiger
159nfNorfolk
160ngNigérie
161niNikaragua
162nlNizozemsko
163noNorsko
164npNepál
165nrNauru
166nuNiue
167nzNový Zéland
168omOmán
169paPanama
170pePeru
171pfFrancouzská Polynésie
172pgPapua - Nová Guinea
173phFilipíny
174pkPákistán
175plPolsko
176pmSt. Pierre a Miquelon
177pnPitcairnovy ostrovy
178prPortoriko
179ptPortugalsko
180pwPalau
181pyParaguay
182qaKatar
183reRéunion
184roRumunsko
185ruRusko
186rwRwanda
187saSaudská Arábie
188sbŠalamounovy ostrovy
189scSeychely
190sdSúdán
191seŠvédsko
192sgSingapur
193shSv. Helena
194siSlovinsko
195sjSvalbard
196skSlovensko
197slSierra Leone
198smSan Marino
199snSenegal
200soSomálsko
201srSurinam
202stSv. Tomáš a Princův ostrov
203svSalvador
204sySýrie
205szSvazijsko
206tcTurks a Caicos
207tdČad
208tfFrancouzská jižní území
209tgTogo
210thThajsko
211tjTadžikistán
212tkTokelau
213tmTurkmenistán
214tnTunisko
215toTonga
216tpVýchodní Timor
217trTurecko
218ttTrinidad a Tobago
219tvTuvalu
220twTaiwan
221tzTanzanie
222uaUkrajina
223ugUganda
224ukVelká Británie
225umMenší odlehlé ostrovy USA
226usSpojené státy americké
227uyUruguay
228uzUzbekistán
229vaVatikán
230vcSv. Vincenc a Grenadiny
231veVenezuela
232vgBritské Panenské ostrovy
233viAmerické Panenské ostrovy
234vnVietnam
235vuVanuatu
236wfWallis Futuna
237wsSamoa
238yeJemen
239ytMayotte
240yuJugoslávie
241zaJihoafrická republika
242zmZambie
245zwZimbabwe
246comobchodní společnosti
247netprovoz intenetu, ISP
248orgneziskové organizace
249eduvýchovně-vzdělávací organizace
250intmezinárodní organizace
251arpaARPAnet
252govvládní organizace
253milvojenské (obranné) organizace
254aeroletecká doprava
255bizvelké obchodní společnosti
256coopdružstevní společnosti
257infoobchodní společnosti
258museummuzea, výstavy
259nameosobní stránky
260proprofesionálové
261suSSSR
262psOkupované palestinské území

Doménu nejvyšší úrovně zjistíme tak, že doménovou adresu rozdělíme na části oddělené tečkou, kde poslední část je námi hledaná doména. Jednoduchým SQL dotazem si z databáze vytáhneme id domény a uložíme jej do proměnné $domain. I ta bude součástí závěrečného SQL dotazu, který do tabulky access uloží veškeré informace o daném přístupu.

// DOMÉNA NEJVYŠŠÍ ÚROVNĚ
if($ip_name!="0"):
    // doména nejvyšší úrovně je poslední částí doménové adresy
    $explode = Explode(".", $ip_name);
    $domain = $explode[Count($explode)-1];
    
    // je doména v databázi ?
    $query = MySQL_Query("SELECT id FROM domain WHERE code = '$domain'");
    if($result = MySQL_Fetch_Array($query))
        $domain = $result["id"];
    else
        $domain = 0;
else:
    $domain = 0;
endif;

Vyhodnocení

Statistiku domén nejvyšší úrovně vypíšeme do tabulky o třech sloupích - Název domény + český význam, Počet přístupů z dané domény, Podíl domény na celkovém počtu přístupů. Postup, kterým vytváříme statistiku, je opět velmi podobný postupu popsanému ve třetím díle tohoto seriálu. Jen zdůrazním, že spojíme tabulky domain a access - položka id v tabulce domain je primárním klíčem a položka domain v tabulce access je klíčem cizím.

// DOMÉNY
echo '<p align="center" class="heading">Domény</p>';
echo '<table width="550" cellspacing="0" align="center">';
echo '<tr><td width="230" class="tableheader">Název</td><td width="50" class="tableheader">Počet</td><td width="280" class="tableheader">Podíl</td>';

// vybíráme domény podle jejich zastoupení
$query = MySQL_Query("SELECT code, description, count(*) AS count_it FROM domain, access WHERE domain.id = domain AND $sql_access_date GROUP BY domain ORDER BY count_it DESC");
$max = MySQL_Result($query, 0, "count_it"); // počet přístupů z nejčastější domény
$move = MySQL_Data_Seek($query, 0); // přesuneme se znovu na začátek

while($result = MySQL_Fetch_Array($query)):
    $width = Round($result["count_it"]/$max*200); // šíř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["code"] ." (" . $result["description"] . ')</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>';

Příště budeme opět pracovat s doménovou adresou počítače a povíme si něco o regionální lokalizaci návštěvníka, tedy určení kraje, okresu, popřípadě města, ze kterého návštěvník pochází.

Předchozí články:
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 (25. 7. 2002)
Diskuze: Statistika přístupů v PHP – domény nejvyšší úrovně
2002-07-25 08:29:12DaveProxy?
2002-07-29 15:17:51Vilém MálekKódy domén
2002-07-29 18:26:15Michal KebrtKódy domén