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čeStatistika přístupů v PHP
– počet unikátních návštěvníků