Statistika přístupů v PHP – detekce prohlížeče
V dnešním pokračování si řekneme, jak zjistit jméno a verzi prohlížeče (browseru), který návštěvník používá. Mimo jiné se dozvíte i to, jak se používají regulární výrazy v SQL dotazech.
Údaje o prohlížeči budeme zjišťovat z proměnné $HTTP_USER_AGENT obsahující hlavičku User-Agent, ve které prohlížeč posílá obvykle své jméno, verzi a informaci o platformě, na které běží.
Pro získání konkrétních informací z hlavičky $HTTP_USER_AGENT můžeme použít minimálně dva postupy. Samotné PHP obsahuje funkci Get_Browser() (viz PHP manuál), která dokáže z hlavičky $HTTP_USER_AGENT zjistit celou řadu údajů. Množství a správnost získaných údajů záleží na obsahu souboru browscap.ini. Tento soubor, který je obsažen v instalaci PHP, byl však naposledy aktualizován 1. října 2000, a proto neobsahuje údaje o nových prohlížečích jako je IE 6, Opera 6, atd. Pokud si nechcete soubor browscap.ini aktualizovat sami, je tato metoda prakticky nepoužitelná.
Tím druhým způsobem je "ruční" zjištění potřebných údajů. Provádí se tak, že se hlavička $HTTP_USER_AGENT postupně porovnává s několika regulárními výrazy, čímž se zjistí žádaná informace. Na první pohled to vypadá celkem jednoduše, ale přesto mohou nastat určité komplikace. Dobře to ilustruje následující tabulka:
Prohlížeč | Příklad hlavičky |
Opera 3 | Mozilla/4.71 (Windows 95;US) Opera 3.62 [en] |
Opera 4 | Mozilla/4.02 (compatible; MSIE 5.0; Windows 95) Opera 4.02 [en] |
Opera 5 | Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 5.12 [en] |
Opera 6 | Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en] |
Opera 6 | Opera/6.0 (Windows 98; U) [en] |
MSIE 3 | Mozilla/2.0 (compatible; MSIE 3.0; Windows 95) |
MSIE 4 | Mozilla/4.0 (compatible; MSIE 4.01; Windows 95) |
MSIE 5 | Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) |
MSIE 6 | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) |
Lynx | Lynx/2.8.3rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.4 |
Konqueror | Mozilla/5.0 (compatible; Konqueror/2.1 Beta 2; X11) |
iCab | Mozilla/4.5 (compatible; iCab Pre2.2; Macintosh; I; PPC) |
Netscape 4 | Mozilla/4.51 [cs] (Win98; I) |
Netscape 6 | Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 Netscape6/6.0 |
Mozilla | Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122 |
Z tabulky jasně vyplývá, že při detekci prohlížeče musíme dodržet určité pořadí. Proč? Tak např. hlavička, kterou se představuje Opera 6 obsahuje někdy i text "MSIE 5.0". Detekci prohlížečů Opera proto musíme provést dříve než detekci MSIE. Pro prohlížeče firmy Netscape je klíčový začátek hlavičky - "Mozilla/_verze_". Tento text však posílají téměř všechny prohlížeče, proto se detekce prohlížečů Netscape provede až na samém konci. Výsledné pořadí tedy vypadá takto: 1. Opera, 2. MSIE, 3. ostatní prohlížeče, 4. Netscape.
Nyní máme dvě možnosti, jak zjistit informace o prohlížeči. Pomocí funkcí pro práci s regulárními výrazy můžeme zjistit vše přímo ve skriptu. Druhý způsob spočívá v tom, že regulární výrazy a jména prohlížečů uložíme do databáze a detekci provedeme pomocí SQL dotazu. Já jsem zvolil druhý způsob, který umožňuje pohodlnou editaci regulárních výrazů i názvů prohlížečů. Navíc můžeme do databáze snadno přidávat nové prohlížeče.
Tabulka browser
Výše zmíněné informace budeme uchovávat v tabulce browser, kterou vytvoříme pomocí tohoto SQL dotazu.
|
- id - unikátní označení každého prohlížeče (primární klíč)
- name - jméno a verze prohlížeče
- browser_regexp - regulární výraz detekující daný prohlížeč
V záznamu s id = 0 je text označující jiné a nezjištěné prohlížeče. Poté musíme dodržet pořadí, které jsme si před chvílí definovali. Od id = 1 to budou prohlížeče Opera, od 21 IE, od 41 ostatní prohlížeče, od 61 Netscape a od 71 prohlížeče Mozilla. Pro psaní regulárních výrazů v SQL platí stejná pravidla jako pro regulární výrazy v PHP, které znáte z těchto dvou článků - Regulární výrazy v PHP (1.) a Regulární výrazy v PHP (2.). Jen připomenu, že metaznak "." označuje jeden libovolný znak. Toho využijeme, protože například Opera 6 se může hlásit textem "Opera 6.0" nebo "Opera/6.0". Metaznak "." vložíme i do všech mezer, protože někdy jsou mezery v hlavičce $HTTP_USER_AGENT nahrazeny znakem "+" (Mozilla/4.0+(compatible;+MSIE+5.5;+Windows+98)). Pokud chceme použít metaznak v jeho původním významu, musíme před něj napsat "\". Regulární výraz detekující MSIE 5.5 pak vypadá takto "msie.5\.".
Ještě jednu poznámku k detekci prohlížečů Netscape 6 a Mozilla. Rozlišení těchto dvou prohlížečů je velmi obtížné, protože se představují velmi podobným způsobem, ostatně oba prohlížeče vycházejí ze stejného jádra. Pokud $HTTP_USER_AGENT obsahuje "netscape6", jedná se logicky o Netscape 6. Jestliže tato hlavička bude obsahovat "mozilla/5", budeme takový prohlížeč považovat za Mozilla, i když to nemusí být vždy úplně správné.
id | name (jméno a verze prohlížeče) | browser_regexp (regulární výraz) |
0 | Jiný, nezjištěno | |
1 | Opera 2 | opera.2 |
2 | Opera 3 | opera.3 |
3 | Opera 4 | opera.4 |
4 | Opera 5 | opera.5 |
5 | Opera 6 | opera.6 |
21 | IE 1 | msie.1 |
22 | IE 2 | msie.2 |
23 | IE 3 | msie.3 |
24 | IE 4 | msie.4 |
25 | IE 5 | msie.5\.0 |
26 | IE 5.5 | msie.5\.5 |
27 | IE 6 | msie.6 |
41 | iCab | icab |
42 | amaya | amaya |
43 | Lynx | lynx|libwww-perl |
44 | Konqueror | konqueror |
45 | Lotus | lotus |
46 | Links | links |
47 | Mosaic | mosaic |
61 | Netscape 1 | mozilla/1 |
62 | Netscape 2 | mozilla/2 |
63 | Netscape 3 | mozilla/3 |
64 | Netscape 4 | mozilla/4 |
65 | Netscape 6 | netscape6 |
71 | Mozilla | mozilla/5 |
Nyní již můžeme sestavit SQL dotaz, který zjistí, o jaký prohlížeč se jedná. Ještě předtím převedeme obsah hlavičky $HTTP_USER_AGENT na malá písmena. SQL dotaz vypadá takto:
|
Z tabulky browser vybíráme pouze id prohlížeče. Následuje podmínka, ve které porovnáváme hlavičku $http_user_agent s regulárními výrazy v databázi. K tomu slouží příkaz REGEXP. Před ním se uvádí daný řetězec, za ním poté regulární výraz. Příkaz ORDER BY id musíme použít, aby bylo dodrženo stanovené pořadí detekce jednotlivých typů prohlížečů. Na závěr pomocí příkazu LIMIT 0,1 omezíme výběr pouze na jeden záznam. Může se totiž stát, že hlavička odpovídá několika regulárním výrazům (viz první tabulka). Nás však zajímá jen první záznam.
Pokud se prohlížeč nepodařilo identifikovat, vložíme do proměnné $browser "0". Tato proměnná poté bude součástí SQL dotazu, který přidá do tabulky access veškeré informace o daném přístupu.
|
V následujícím pokračování bude řeč o detekci operačních systémů. Též se dozvíte, jak provést vyhodnocení údajů o prohlížečích a operačních systémech.
Hotovou aplikaci si můžete prohlédnout a vyzkoušet. V této ukázkové verzi se provádí statistika přístupů stránek www.czechia.cz/help.