Statistika přístupů v PHP – domény nejvyšší úrovně
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
- Top-level domain – top-level domény, zajímavé informace o „exotických“, nových a prehistorických doménách
- List of Internet TLDs – přehled domén nejvyšší úrovně
- Počítačová encyklopedie – seriál Jiřího Peterky, o doménách se dočtete v kapitole DNS
- Rodina protokolů TCP/IP – přednáška Jiřího Peterky, o doménách pojednává pojednává kapitola Systém DNS
- Root-Zone Whois – informace o správcích národních domén
- Domain name registries – odkazy na správce národních domén
- Country codes – označení zemí dle několika standardů
- ISO 3166 – standard popisující označení zemí
- Páni interneru – seriál Jiřího Peterky, mimo jiné informace o organizaci IANA či přidělování IP adres
- IANA – organizace bdící nad přidělováním IP adres
- Co že je to ten „RIPE“? – svérázně podané informace o IP adresách
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.
Mohlo by vás také zajímat
-
Souboj na trhu s CPU pro servery: AMD vs. Intel
8. prosince 2023 -
AI v programování: Jak používat GitHub Copilot (část 1)
12. února 2024 -
Zabezpečení e-mailů: Jak můžete chránit vaši firemní komunikaci
13. prosince 2023
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024