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

27. března 2004

Tentokrát začneme pracovat s doménovou adresou a řekneme si, jak zjistit doménu nejvyšší úrovně (cz, sk, com a další), což je většinou země, ze které 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 popisky.

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/.

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. 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 $_SERVER['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á $_SERVER['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($_SERVER[‚HTTP_X_FORWARDED_FOR‘])) {
  $explode_ip = explode(‚,‘, $_SERVER[‚HTTP_X_FORWARDED_FOR‘]);
  $ip = $explode_ip[0];
} else {
  $ip = $_SERVER[‚REMOTE_ADDR‘];
}

Následně můžeme zjistit i doménovou adresu. V proměnné $_SERVER['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, tedy něco jako XXX.XXX.XXX.XXX, kde X je libovolná číslice. V každé části oddělené tečkou musí být alespoň jedna číslice.

// DOMENOVA ADRESA
if(isset($_SERVER[‚REMOTE_HOST‘]) and $_SERVER[‚REMOTE_HOST‘] != “) {
  $ip_name = $_SERVER[‚REMOTE_HOST‘];
} else {
  $ip_name = gethostbyaddr($ip);
}
// pokud se nepodarilo IP adresu prevest na domenovou adresu, vlozime do $ip_name „0“
$ip_name = strtolower($ip_name);
if($ip_name == “) $ip_name = 0;
else 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) NOT NULL,
  description varchar(50) NOT NULL,
  PRIMARY KEY (id)
);

  • id – unikátní označení každé domény (primární klíč)
  • code – doména (například cz, com, info)
  • description – popis domény, většinou stát

Tabulka domain ve skutečnosti vypadá jako tabulka uvedená níže. Pokud se vám bude hodit i v jiných aplikacích, můžete si ji stáhnout jako samostatný soubor.

id code description
0 ?? Nezjištěno
1 ac Ascension (ostrov)
2 ad Andorra
3 ae Spojené arabské emiráty
4 af Afghánistán
5 ag Antigua a Barbuda
6 ai Anguilla
7 al Albánie
8 am Arménie
9 an Nizozemské Antily
10 ao Angola
11 aq Antarktida
12 ar Argentina
13 as Americká Samoa
14 at Rakousko
15 au Austrálie
16 aw Aruba
17 az Ázerbájdžán
18 ba Bosna a Hercegovina
19 bb Barbados
20 bd Bangladéš
21 be Belgie
22 bf Burkina
23 bg Bulharsko
24 bh Bahrajn
25 bi Burundi
26 bj Benin
27 bm Bermudy
28 bn Brunej
29 bo Bolívie
30 br Brazílie
31 bs Bahamy
32 bt Bhútán
33 bv Bouvetův ostrov
34 bw Botswana
35 by Bělorusko
36 bz Belize
37 ca Kanada
38 cc Kokosové ostrovy
39 cd Kongo – dem. republika
40 cf Středoafrická republika
41 cg Kongo
42 ch Švýcarsko
43 ci Cote d’Ivoire
44 ck Cookovy ostrovy
45 cl Chile
46 cm Kamerun
47 cn Čína
48 co Kolumbie
49 cr Kostarika
50 cu Kuba
51 cv Kapverdy
52 cx Vánoční ostrov
53 cy Kypr
54 cz Česko
55 de Německo
56 dj Džibutsko
57 dk Dánsko
58 dm Dominika
59 do Dominikánská republika
60 dz Alžírsko
61 ec Ekvádor
62 ee Estonsko
63 eg Egypt
64 eh Západní Sahara
65 er Eritrea
66 es Španělsko
67 et Etiopie
68 fi Finsko
69 fj Fidži
70 fk Falklandy (Malvíny)
71 fm Federativní státy Mikronésie
72 fo Faerské ostrovy
73 fr Francie
74 ga Gabon
76 gd Grenada
77 ge Gruzie
78 gf Francouzská Guyana
79 gg Guernsey
80 gh Ghana
81 gi Gibraltar
82 gl Grónsko
83 gm Gambie
84 gn Guinea
85 gp Guadeloupe
86 gq Rovníková Guinea
87 gr Řecko
88 gs Jižní Georgie a Jižní Sandwichovy ostrovy
89 gt Guatemala
90 gu Guam
91 gw Guinea-Bissau
92 gy Guyana
93 hk Hongkong
94 hm Heardův ostrov a McDonaldovy ostrovy
95 hn Honduras
96 hr Chorvatsko
97 ht Haiti
98 hu Maďarsko
99 id Indonésie
100 ie Irsko
101 il Izrael
102 im Man (ostrov)
103 in Indie
104 io Britské indickooceánské území
105 iq Irák
106 ir Írán
107 is Island
108 it Itálie
109 je Jersey
110 jm Jamajka
111 jo Jordánsko
112 jp Japonsko
113 ke Keňa
114 kg Kyrgyzstán
115 kh Kambodža
116 ki Kiribati
117 km Komory
118 kn Sv. Kryštof a Nevis
119 kp Korejská lidově dem. republika (KLDR)
120 kr Korejská republika
121 kw Kuvajt
122 ky Kajmanské ostrovy
123 kz Kazachstán
124 la Laos
125 lb Libanon
126 lc Sv. Lucie
127 li Lichtenštejnsko
128 lk Srí Lanka
129 lr Libérie
130 ls Lesotho
131 lt Litva
132 lu Lucembursko
133 lv Lotyšsko
134 ly Libye
135 ma Maroko
136 mc Monako
137 md Moldávie
138 mg Madagaskar
139 mh Marshallovy ostrovy
140 mk Makedonie
141 ml Mali
142 mm Myanmar
143 mn Mongolsko
144 mo Macao
145 mp Severní Mariany
146 mq Martinik
147 mr Mauritánie
148 ms Montserrat
149 mt Malta
150 mu Mauricius
151 mv Maledivy
152 mw Malawi
153 mx Mexiko
154 my Malajsie
155 mz Mosambik
156 na Namibie
157 nc Nová Kaledonie
158 ne Niger
159 nf Norfolk
160 ng Nigérie
161 ni Nikaragua
162 nl Nizozemsko
163 no Norsko
164 np Nepál
165 nr Nauru
166 nu Niue
167 nz Nový Zéland
168 om Omán
169 pa Panama
170 pe Peru
171 pf Francouzská Polynésie
172 pg Papua – Nová Guinea
173 ph Filipíny
174 pk Pákistán
175 pl Polsko
176 pm St. Pierre a Miquelon
177 pn Pitcairnovy ostrovy
178 pr Portoriko
179 pt Portugalsko
180 pw Palau
181 py Paraguay
182 qa Katar
183 re Réunion
184 ro Rumunsko
185 ru Rusko
186 rw Rwanda
187 sa Saudská Arábie
188 sb Šalamounovy ostrovy
189 sc Seychely
190 sd Súdán
191 se Švédsko
192 sg Singapur
193 sh Sv. Helena
194 si Slovinsko
195 sj Svalbard
196 sk Slovensko
197 sl Sierra Leone
198 sm San Marino
199 sn Senegal
200 so Somálsko
201 sr Surinam
202 st Sv. Tomáš a Princův ostrov
203 sv Salvador
204 sy Sýrie
205 sz Svazijsko
206 tc Turks a Caicos
207 td Čad
208 tf Francouzská jižní území
209 tg Togo
210 th Thajsko
211 tj Tadžikistán
212 tk Tokelau
213 tm Turkmenistán
214 tn Tunisko
215 to Tonga
216 tp Východní Timor
217 tr Turecko
218 tt Trinidad a Tobago
219 tv Tuvalu
220 tw Taiwan
221 tz Tanzanie
222 ua Ukrajina
223 ug Uganda
224 uk Velká Británie
225 um Menší odlehlé ostrovy USA
226 us Spojené státy americké
227 uy Uruguay
228 uz Uzbekistán
229 va Vatikán
230 vc Sv. Vincenc a Grenadiny
231 ve Venezuela
232 vg Britské Panenské ostrovy
233 vi Americké Panenské ostrovy
234 vn Vietnam
235 vu Vanuatu
236 wf Wallis Futuna
237 ws Samoa
238 ye Jemen
239 yt Mayotte
240 yu Jugoslávie
241 za Jihoafrická republika
242 zm Zambie
245 zw Zimbabwe
246 com obchodní společnosti
247 net provoz intenetu, ISP
248 org neziskové organizace
249 edu výchovně-vzdělávací organizace
250 int mezinárodní organizace
251 arpa ARPAnet
252 gov vládní organizace
253 mil vojenské (obranné) organizace
254 aero letecká doprava
255 biz velké obchodní společnosti
256 coop družstevní společnosti
257 info obchodní společnosti
258 museum muzea, výstavy
259 name osobní stránky
260 pro profesionálové
261 su SSSR
262 ps Okupované 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.

// DOMENA NEJVYSSI UROVNE
$domain = 0;
if($ip_name != ‚0‘) {
  // domena nejvyssi urovne je posledni casti domenove adresy
  $explode = explode(‚.‘, $ip_name);
  $domain = $explode[count($explode)-1];
  // je domena v databazi ?
  $query = mysql_query(„SELECT id FROM domain WHERE code = ‚$domain'“);
  if($result = mysql_fetch_array($query))
    $domain = $result[‚id‘];
  else
    $domain = 0;
}

Vyhodnocení

Statistiku domén nejvyšší úrovně vypíšeme do tabulky o třech sloupích – Název domény + český popisek, 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 v článku o detekci operačního systému. 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.

// DOMENY
echo ‚<h2>Domény</h2>‘;
echo ‚<table width=“550″ cellspacing=“0″>‘;
echo ‚<tr><th>Název</th><th>Počet</th><th>Podíl</th></tr>‘;
// vybirame domeny podle jejich zastoupeni
$query = mysql_query(„SELECT code, description, count(domain) AS count_it FROM access JOIN domain ON (domain = domain.id) WHERE $sql_access_date GROUP BY domain ORDER BY count_it DESC“);
$max = mysql_result($query, 0, ‚count_it‘); // pocet pristupu z nejcastejsi domeny
$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‘]/($pageviews/100)); // podil v procentech
  echo ‚<tr><td>‘ . $result[‚code‘] . ‚ (‚ . $result[‚description‘] . ‚)</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
}
echo „</table>\n\n“;

Odkazy, zdroje

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