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.






