Navigace

Hlavní menu

 

Submenu

 

Statistika přístupů v PHP – detekce operačního systému

Dnes navážeme na předchozí článek o detekci prohlížečů a povíme si, jak zjistit další údaj o návštěvníkovi - použitý operační systém. Na závěr provedeme vyhodnocení údajů o prohlížečích a operačních systémech, včetně jednoduchého grafického znázornění.

Postup, kterým budeme zjišťovat informaci o operačním systému, je velmi podobný postupu, kterým jsme zjišťovali údaje o prohlížeči. Z minulého dílu víme, že proměnná $HTTP_USER_AGENT obsahuje kromě informací o prohlížeči i informaci o platformě, na které prohlížeč běží. Z důvodů popsaných v minulém článku nevyužijeme funkci Get_Browser(), ale "ruční dolování" potřebné informace, k čemuž opět použijeme regulární výrazy v kombinaci s databází.

Detekce operačního systému je o něco komplikovanější než detekce prohlížečů. Většina operačních systémů (OS) se totiž hlásí několika různými způsoby, jak je uvedeno v následující tabulce:

ProhlížečPříklad hlavičky
Windows MEMozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
Windows MEOpera/6.0 (Windows ME; U) [cs]
Windows 98Mozilla/4.75 [en] (Win98; U)
Windows 98Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Windows 98Mozilla/4.0 (compatible; Opera/3.0; Windows 4.10) 3.50
Windows 95Mozilla/4.0 (compatible; MSIE 5.5; Windows 95)
Windows 95Mozilla/4.05 [en] (Win95; I)
Windows 2000Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [cs]
Windows 2000Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Windows XPMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Windows XPMozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.0 [cs]
Windows NTMozilla/4.0 (compatible; MSIE 5.01; Windows NT)
Windows NTMozilla/4.5 [en] (WinNT; I)
Windows NTMozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1
MacintoshMozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC)
MacintoshMozilla/4.5 (compatible; iCab Pre2.2; Macintosh; I; PPC)
Windows 3.xMozilla/2.0 (Win16; I)
Windows 3.xMozilla/2.0 (compatible; MSIE 3.02; Windows 3.1)
LinuxMozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122
SunOSMozilla/4.7 [en] (X11; I; SunOS 5.5.1 sun4m)

Z tabulky opět vyplývá nutnost dodržet při detekci určité pořadí. Například detekce Windows ME musí být provedena dříve, než detekce Windows 98, protože hlavička s Windows ME často obsahuje i text "Windows 98". Obdobně Windows 2000 a XP musí být dříve než Windows NT a podobně.

Tabulka OS

Veškeré údaje o operačních systémech uložíme do tabulky os, kterou vytvoříme pomocí tohoto SQL dotazu:

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

  • id - unikátní označení každého operačního systému (primární klíč)
  • name - název operačního systému
  • os_regexp - regulární výraz zjišťující daný OS

Při vkládání záznamů do tabulky musíme dodržet pořadí ze vzorové tabulky. Z důvodů objasněných v minulém článku píšeme v položce os_regexp místo mezer metaznak ".". Skutečnost, že se každý operační systém může představit několika způsoby, snadno vyřešíme použitím metaznaku "|". Text poté vyhovuje regulárnímu výrazu, pokud vyhovuje alespoň jedné jeho části.

idname (operační systém)os_regexp (regulární výraz)
0Jiný, nezjištěno 
1Windows MEwin.9x.4\.90|windows.me
2Windows 98windows.98|win98|windows.4\.10
3Windows 95windows.95|win95
4Windows 2000windows.nt.5\.0|windows.2000
5Windows XPwindows.xp|windows.nt.5\.1
6Windows NTwindows.nt|winnt
7Macintoshmac
8Linuxlinux
9Windows 3.xwin16|win3\.|windows.3\.
10Unixunix
11BeOSbeos
12SunOSsunos
13HP-UXhp-ux
14OSFosf
15IRIXirix
16FreeBSDfreebsd
17OpenBSDopenbsd
18OS/2os/2
19Ostatní Windowswin

Detekci operačního systému provedeme podobně jako detekci prohlížeče použitím regulárního výrazu přímo v SQL dotazu. Do proměnné $os se uloží id operačního systému. Obsah této proměnné se v závěru celého skriptu uloží do tabulky access, konkrétně do položky os:

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

Vyhodnocení údajů o prohlížečích a operačních systémech

Výslednou statistiku zapíšeme do tabulky o 3 sloupcích - Název prohlížeče nebo OS, Počet přístupů s daným softwarem, Podíl v procentech + grafické znázornění:

// BROWSERY
echo '<p align="center" class="heading">Prohlížeče</p>';
echo '<table width="430" cellspacing="0" align="center">';
echo '<tr><td width="100" class="tableheader">Název</td><td width="50" class="tableheader">Počet</td><td width="280" class="tableheader">Podíl</td>';

Nyní musíme z tabulky access získat statistiku prohlížečů za dané období (= $sql_access_date), k čemuž potřebujeme pouze dva údaje - název prohlížeče a počet přístupů s tímto prohlížečem. Vše provedeme spojením tabulek browser a access, kde položka id v tabulce browser je primárním klíčem a položka browser v tabulce access cizím klíčem (obsahuje primární klíče z tabulky browser). Záznamy sdružíme do skupin určených položkou browser (= unikátní označení prohlížeče) a seřadíme sestupně (DESC) podle zastoupení jednotlivých prohlížečů. Obdobný postup budeme používat i v dalších článcích, takže pokud vám není spojování tabulek a použití agregačních funkcí (například count) úplně jasné, nastudujte si články Dotazy v jazyce SQL (II.) a Dotazy v SQL s agregací.

Jelikož budeme podíl jednotlivých prohlížečů znázorňovat i graficky, musíme vědět, kolik přístupů bylo zaznamenáno s nejpoužívanějším prohlížečem. To zjistíme použitím funkce MySQL_Result(), kde první parametr označuje výsledek, druhý číslo záznamu a třetí název položky, přičemž záznamy jsou číslovány od nuly. Protože se záznamy z databáze budeme ještě pracovat, musíme pomocí funkce MySQL_Data_Seek() přesunout ukazatel výsledku na první záznam:

// vybíráme browsery podle jejich zastoupení
$query = MySQL_Query("SELECT name, count(*) AS count_it FROM browser, access WHERE browser.id = browser AND $sql_access_date GROUP BY browser ORDER BY count_it DESC");
$max = MySQL_Result($query, 0, "count_it");    // počet přístupů s nejpoužívanějším browserem
$move = MySQL_Data_Seek($query, 0);    // přesuneme se znovu na začátek

Konečně můžeme začít se zápisem dat do tabulky. U každého prohlížeče musíme vypočítat šířku obrázku znázorňujícího podíl daného prohlížeče. To provedeme použitím matematické trojčlenky, kde obrázek u prohlížeče s největším podílem bude mít šířku 200 px. Percentuelní podíl přístupů s daným prohlížečem na celkovém počtu přístupů za dané období (= $viewpages) spočítáme pomocí funkce BCDiv() - první parametr označuje dělenec, druhý dělitele a třetí počet desetinných míst. Získané údaje poté zapíšeme do tabulky:

while($result = MySQL_Fetch_Array($query)):
    $width = Round($result["count_it"]/$max*200);    // šířka obrázku znázorňujícího podíl
    $rate = BCDiv($result["count_it"], ($pageviews/100), 2); // podíl v procentech
    echo '<tr><td>' . $result["name"] . '</td><td>' . $result["count_it"] . '</td><td><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate . ' %</td></tr>';
endwhile;

echo '</table><br>';

Stejně jako statistiku prohlížečů vytvoříme i statistiku operačních systémů:

// OPERAČNÍ SYSTÉMY
echo '<p align="center" class="heading">Operační systémy</p>';
echo '<table width="430" cellspacing="0" align="center">';
echo '<tr><td width="100" class="tableheader">Název</td><td width="50" class="tableheader">Počet</td><td width="280" class="tableheader">Podíl</td>';

// vybíráme operační systémy podle jejich zastoupení
$query = MySQL_Query("SELECT name, count(*) AS count_it FROM os, access WHERE os.id = os AND $sql_access_date GROUP BY os ORDER BY count_it DESC");
$max = MySQL_Result($query, 0, "count_it");    // počet přístupů s nejpoužívanějším operačním systémem
$move = MySQL_Data_Seek($query, 0);    // přesuneme se znovu na začátek

while($result = MySQL_Fetch_Array($query)):
    $width = Round($result["count_it"]/$max*200);    // šířka obrázku znázorňujícího podíl
    $rate = BCDiv($result["count_it"], ($pageviews/100), 2);    // podíl v procentech
    echo '<tr><td>' . $result["name"] . '</td><td>' . $result["count_it"] . '</td><td><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate . ' %</td></tr>';
endwhile;

echo '</table><br>';

Tolik o prohlížečích a operačních systémech. Příště se podíváme na to, jak zjistit rozlišení a barevnou hloubku obrazovky.

Předchozí díly:

Statistika přístupů v PHP – detekce prohlížeče
Statistika přístupů v PHP – počet unikátních návštěvníků
Kebrt, Michal (30.5. 2002)
Diskuze: Statistika přístupů v PHP – detekce operačního sys ...