Zoner.cz | Czechia.com | Inshop.cz
Nic
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.

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

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:

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ů


Michal Kebrt (23.5. 2002)





Vyhledávání

Rozšířené vyhledávání



Nejčtenější






Diskuzní kotel





Četli jste už?







Hodnotilo: 67 čtenářů
Výsledek: 2,86


 Tisk
 Doporučit článek

Diskuze: Statistika přístupů v PHP – detekce prohlížeče
       
Zobrazit všePřidat nový
Redakce Interval.cz |  Inzerce na Interval.cz |  Hledáme nové autory TOPlist ISSN 1212-8651 
 © Zoner software, s.r.o., všechna práva vyhrazena, tento server dodržuje právní předpisy o ochraně osobních údajů.