Zoner.cz | Czechia.com | Inshop.cz | CA Czechia.cz
Nic
TOPlist
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 ME Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
Windows ME Opera/6.0 (Windows ME; U) [cs]
Windows 98 Mozilla/4.75 [en] (Win98; U)
Windows 98 Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Windows 98 Mozilla/4.0 (compatible; Opera/3.0; Windows 4.10) 3.50
Windows 95 Mozilla/4.0 (compatible; MSIE 5.5; Windows 95)
Windows 95 Mozilla/4.05 [en] (Win95; I)
Windows 2000 Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [cs]
Windows 2000 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Windows XP Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Windows XP Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.0 [cs]
Windows NT Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)
Windows NT Mozilla/4.5 [en] (WinNT; I)
Windows NT Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1
Macintosh Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC)
Macintosh Mozilla/4.5 (compatible; iCab Pre2.2; Macintosh; I; PPC)
Windows 3.x Mozilla/2.0 (Win16; I)
Windows 3.x Mozilla/2.0 (compatible; MSIE 3.02; Windows 3.1)
Linux Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122
SunOS Mozilla/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.

id name (operační systém) os_regexp (regulární výraz)
0 Jiný, nezjištěno  
1 Windows ME win.9x.4\.90|windows.me
2 Windows 98 windows.98|win98|windows.4\.10
3 Windows 95 windows.95|win95
4 Windows 2000 windows.nt.5\.0|windows.2000
5 Windows XP windows.xp|windows.nt.5\.1
6 Windows NT windows.nt|winnt
7 Macintosh mac
8 Linux linux
9 Windows 3.x win16|win3\.|windows.3\.
10 Unix unix
11 BeOS beos
12 SunOS sunos
13 HP-UX hp-ux
14 OSF osf
15 IRIX irix
16 FreeBSD freebsd
17 OpenBSD openbsd
18 OS/2 os/2
19 Ostatní Windows win

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ů


Michal Kebrt (30.5. 2002)




Vyhledávání

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



Nejčtenější







Diskuzní kotel






Četli jste už?






Hodnotilo: 581 čtenářů
Výsledek: 2,79


 Tisk
 Doporučit článek

Diskuze: Statistika přístupů v PHP – detekce operačního sys ...
       
Zobrazit všePřidat nový
Redakce Interval.cz |  Inzerce na Interval.cz |  Hledáme nové autory 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ů.