Navigace

Hlavní menu

 

Submenu

 

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 3Mozilla/4.71 (Windows 95;US) Opera 3.62 [en]
Opera 4Mozilla/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 6Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en]
Opera 6Opera/6.0 (Windows 98; U) [en]
MSIE 3Mozilla/2.0 (compatible; MSIE 3.0; Windows 95)
MSIE 4Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)
MSIE 5Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
MSIE 6Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
LynxLynx/2.8.3rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.4
KonquerorMozilla/5.0 (compatible; Konqueror/2.1 Beta 2; X11)
iCabMozilla/4.5 (compatible; iCab Pre2.2; Macintosh; I; PPC)
Netscape 4Mozilla/4.51 [cs] (Win98; I)
Netscape 6Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 Netscape6/6.0
MozillaMozilla/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.

CREATE TABLE browser (
     id int(11) NOT NULL,
     name varchar(50),
     browser_regexp varchar(70),
     PRIMARY KEY (id)
);

  • 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é.

idname (jméno a verze prohlížeče)browser_regexp (regulární výraz)
0Jiný, nezjištěno
1Opera 2opera.2
2Opera 3opera.3
3Opera 4opera.4
4Opera 5opera.5
5Opera 6opera.6
21IE 1msie.1
22IE 2msie.2
23IE 3msie.3
24IE 4msie.4
25IE 5msie.5\.0
26IE 5.5msie.5\.5
27IE 6msie.6
41iCabicab
42amayaamaya
43Lynxlynx|libwww-perl
44Konquerorkonqueror
45Lotuslotus
46Linkslinks
47Mosaicmosaic
61Netscape 1mozilla/1
62Netscape 2mozilla/2
63Netscape 3mozilla/3
64Netscape 4mozilla/4
65Netscape 6netscape6
71Mozillamozilla/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:

SELECT id FROM browser WHERE '$http_user_agent' REGEXP browser_regexp ORDER BY id LIMIT 0,1

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.

$http_user_agent = StrToLower($HTTP_USER_AGENT); // převede na malá písmena

// zjistíme informace o počítači (prohlížeč, operační systém, rozlišení, barevná hloubka)
// "0" označuje neznámý prohližeč, OS, ...

// BROWSER
$query = MySQL_Query("SELECT id FROM browser WHERE '$http_user_agent' REGEXP browser_regexp ORDER BY id LIMIT 0,1");
if ($result = MySQL_Fetch_Array($query))
     $browser = $result["id"];
else
     $browser = 0;

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.

Předchozí díl:

Statistika přístupů v PHP – počet unikátních návštěvníků
Kebrt, Michal (23.5. 2002)
Diskuze: Statistika přístupů v PHP – detekce prohlížeče
2002-11-11 16:17:16Jan Kučerabrowscap.ini Update