Statistika přístupů v PHP – rozlišení a barevná hloubka

21. února 2004

Statistiku přístupů v tomto článku doplníme o další informace čistě technického rázu. Upozorňuji, že zjištění rozlišení a barevné hloubky vyžaduje použití JavaScriptu, bez něj je získání těchto informací prakticky nemožné.

Hotovou aplikaci si jako obvykle můžete prohlédnout a vyzkoušet. V této ukázkové verzi se provádí statistika přístupů stránek http://www.czechia.cz/help/.

Na úvod trocha teorie. Samotné PHP je spuštěno na serveru a proto nemůže kromě informací, které klient pošle v požadavku na stránku (hlavička User-Agent), zjistit o klientovi žádné další informace, tedy ani rozlišení, ani barevnou hloubku. Jediným způsobem, jak tyto údaje „dostat“ do PHP skriptu, je použití JavaScriptu.

Pomocí JavaScriptu tedy vložíme počítadlo přístupů (counter.php) do stránky jako malý obrázek s několika parametry. První parametr referer obsahuje URL stránky, ze které uživatel přišel na aktuální stránku. S tímto parametrem budeme pracovat příště. V dalších parametrech využijeme vlastnosti javascriptového objektu screen. Parametr screenres obsahuje rozlišení ve formátu ŠÍŘKAxVÝŠKA (například 1024×768). Šířku máme v JavaScriptu ve screen.width a výšku ve screen.height. Poslední parametr colordepth obsahuje barevnou hloubku v bps (bits per pixel), tento údaj je ve screen.colorDepth.

<script language=“JavaScript“ type=“text/javascript“>
<!–
document.write(„<img src=\“__vas_server__/counter.php?referer=“ + escape(top.document.referrer) + „&screenres=“ + screen.width + „x“ + screen.height + „&colordepth=“ + screen.colorDepth + „\“ width=\“1\“ height=\“1\“ alt=\“\“>“);
// –>
</script>

Bohužel pro nás, ne každý prohlížeč podporuje JavaScript. Abychom mohli zaznamenat i přístupy z takovýchto prohlížečů, musíme obrázek vložit klasickým způsobem. Aby nedošlo k dvojímu volání počítadla u prohlížečů s podporou JavaScriptu, umístíme obrázek do elementu <noscript>, jehož obsah je prohlížeči s podporou JavaScriptu povinně ignorován.

<noscript>
<img src=“ vas_server__/counter.php“ width=“1″ height=“1″ alt=““ border=“0″>
</noscript>

Tabulka resolution

V tabulce resolution budeme mít jednotlivé typy rozlišení. Vytvoříme ji pomocí SQL dotazu, uvedeného níže. Autorem aktuálního seznamu, který obsahuje i velmi exotická rozlišení, je Pavel Kodýtek.

CREATE TABLE resolution (
  id int(11) NOT NULL,
  screenres varchar(10) NOT NULL,
  PRIMARY KEY (id)
)

  • id – unikátní označení každého typu rozlišení (primární klíč)
  • screenres – rozlišení

id screenres
0 Jiné
1 640×480
2 790×566
3 800×600
4 832×624
5 960×720
6 1000×700
7 1024×600
8 1024×640
9 1024×742
10 1024×768
11 1152×768
12 1152×864
13 1152×870
14 1152×900
15 1280×768
16 1280×800
17 1280×854
18 1280×960
19 1280×977
20 1280×1024
21 1360×1020
22 1400×1050
23 1440×900
24 1600×600
25 1600×998
26 1600×1024
27 1600×1200
28 1600×1280
29 1920×1200
30 2048×1768
31 2048×768
32 2304×864
33 2560×960
34 2560×1024
35 3840×1024

Nyní můžeme snadno zjistit id použitého rozlišení porovnáním proměnné $screenres se záznamy v tabulce resolution.

// ROZLISENI
$resolution = 0;
if (isset($_GET[‚screenres‘])) {
  $screenres = addslashes($_GET[‚screenres‘]);
  $query = mysql_query(„SELECT id FROM resolution WHERE screenres = ‚$screenres'“);
  if ($result = mysql_fetch_array($query))
    $resolution = $result[‚id‘];
}

Tabulka colordepth

V tabulce colordepth budou jednotlivé typy barevné hloubky. SQL dotaz, který vytvoří tuto tabulku, vypadá následovně:

CREATE TABLE colordepth (
  id int(11) NOT NULL,
  depth int(11) NOT NULL,
  description varchar(20) NOT NULL,
  PRIMARY KEY (id)
)

id depth description
0 0 Jiná, nezjištěno
1 1 16 barev
2 8 256 barev
3 16 16 bitů (High Color)
4 24 24 bitů (True Color)
5 32 32 bitů (True Color)

  • id – unikátní označení každého typu barevné hloubky (primární klíč)
  • depth – barevná hloubka v bps (bits per pixel)
  • description – popis údaje z položky depth

Porovnáním proměnné $colordepth se záznamy v tabulce colordepth zjistíme id barevné hloubky používané na klientském počítači (monitoru).

// BAREVNA HLOUBKA
$depth = 0;
if(isset($_GET[‚colordepth‘])) {
  $colordepth = addslashes($_GET[‚colordepth‘]);
  $query = mysql_query(„SELECT id FROM colordepth WHERE depth = ‚$colordepth'“);
  if ($result = mysql_fetch_array($query))
    $depth = $result[‚id‘];
}

Obsah obou proměnných $resolution i $depth se v závěru celého skriptu counter.php uloží do tabulky access, do položek resolution, respektive colordepth.

Vyhodnocení získaných údajů o rozlišení o barevné hloubce

Výslednou statistiku za dané období zapíšeme do tabulky o třech sloupcích – Typ rozlišení nebo barevné hloubky, Počet přístupů s daným typem, Podíl v procentech + grafické znázornění.

// ROZLISENI
echo ‚<h2>Rozlišení</h2>‘;
echo ‚<table width=“430″ cellspacing=“0″>‘;
echo ‚<tr><th>Typ</th><th>Počet</th><th>Podíl</th></tr>‘;

Následující část je velmi podobná vyhodnocení údajů o prohlížečích a operačních systémech popsanému v předchozím článku, proto již nebudu vše podrobně komentovat. Potřebné údaje získáme spojením tabulek resolution a access – položka id v tabulce resolution je primární klíčem, zatímco položka resolution v tabulce access je klíčem cizím.

// vybirame rozliseni podle jejich zastoupeni
$query = mysql_query(„SELECT screenres, count(resolution) AS count_it FROM access JOIN resolution ON (resolution = resolution.id) WHERE $sql_access_date GROUP BY resolution ORDER BY count_it DESC“);
$max = mysql_result($query, 0, ‚count_it‘); // pocet pristupu s nejpouzivanejsim rozlisenim
$move = mysql_data_seek($query, 0); // presuneme se znovu na zacatek
while($result = mysql_fetch_array($query)) {
  $width = round($result[‚count_it‘]/$max*200); // sirka obrazku znazornujiciho podil
  $rate = sprintf(‚%.2f‘, $result[‚count_it‘]/($pageviews/100)); // podil v procentech
  echo ‚<tr><td>‘ . $result[‚screenres‘] . ‚</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
}
echo „</table>\n\n“;

Analogicky vytvoříme i statistiku „Barevná hloubka“.

// BARVY
echo ‚<h2>Barevná hloubka</h2>‘;
echo ‚<table width=“480″ cellspacing=“0″>‘;
echo ‚<tr><th>Typ</th><th>Počet</th><th>Podíl</th></tr>‘;
// vybirame barevne hloubky podle jejich zastoupeni
$query = mysql_query(„SELECT description, count(colordepth) AS count_it FROM access JOIN colordepth ON (resolution = colordepth.id) WHERE $sql_access_date GROUP BY colordepth ORDER BY count_it DESC“);
$max = mysql_result($query, 0, ‚count_it‘); // pocet pristupu s nejpouzivanejsi barevnou hloubkou
$move = mysql_data_seek($query, 0); // presuneme se znovu na zacatek
while($result = mysql_fetch_array($query)) {
  $width = round($result[‚count_it‘]/$max*200); // sirka obrazku znazornujiciho podil
  $rate = sprintf(‚%.2f‘, $result[‚count_it‘]/($pageviews/100)); // podil v procentech
  echo ‚<tr><td>‘ . $result[‚description‘] . ‚</td><td>‘ . $result[‚count_it‘] . ‚</td><td><img src=“1.gif“ width=“‚ . $width . ‚“ height=“8″ alt=““ /> ‚ . $rate . ‚ %</td></tr>‘;
}
echo „</table>\n\n“;

Tímto článkem končí zjišťování a vyhodnocování technických údajů (prohlížeč, operační systém, rozlišení, barevná hloubka).

Pozn. red.: Tento článek vyšel poprvé 10. 6. 2002. Původní verze článku a k němu vedené diskuse jsou vám k dispozici v ZIP archivech.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *