Počítadlo návštev v PHP a MySQL

02.10.2012 17:54 ·

Možno si niekto všimol, že občas počítadlo návštev bolo vynulované. Neviem, čo to spôsobilo, ale stalo sa to nie len na tejto stránke, ale aj na inej pod rovnakou doménou.

Údaje boli ukladané do súboru na serveri. Pri obnove ma zachránila cache pamäť google, kde boli čísla s ako takou aktuálnosťou zachované. Toto počítadlo bolo jedným z externých skriptov, ktoré na webe používam, no vzhľadom na tieto výpadky som sa rozhodol napísať vlastné, ktoré pracuje s MySQL databázou (db).

Na zobrazení sa nič nemení, počítajú sa celkový počet návštev, denný počet návštev a momentálny počet pri načítaní stránky. Skript vyzerá nasledovne:

<?php 
$q 
mysql_query("select count(*) from pocitadlo where 
cas < curdate()"
); 
list(
$starsie_ako_dnes) = mysql_fetch_row($q); 
if (
$starsie_ako_dnes)  
{     
    
mysql_query("update settings set value=value+$starsie_ako_dnes 
where name='navstev'"
); 
    
mysql_query("delete from pocitadlo where cas < curdate()"); 


$q 
mysql_query("select count(*) from pocitadlo where 
ip = '$_SERVER[REMOTE_ADDR]' and timestampdiff(MINUTE,cas,now()) 
< 10"
); 
list(
$je_navsteva) = mysql_fetch_row($q); 
if (!
$je_navstevamysql_query("insert into pocitadlo (ip) values 
('$_SERVER[REMOTE_ADDR]')"
); 

$q 
mysql_query("select count(*) from pocitadlo"); 
list(
$navstev_dnes) = mysql_fetch_row($q); 

$q 
mysql_query("select value from settings where 
name = 'navstev'"
); 
list(
$navstev_celkom) = mysql_fetch_row($q); 
$navstev_celkom 
+= $navstev_dnes

$q 
mysql_query("select count(*) from pocitadlo where 
timestampdiff(MINUTE,cas,now()) <= 10"
); 
list(
$online) = mysql_fetch_row($q); 

echo 
"Celkom: $navstev_celkom | Dnes: $navstev_dnes | 
Online: $online</span>"

?>

Neuvádzam pripojenie k db, skript pripájam k zvyšku kódu pomocou funkcie include. V db je vytvorená tabuľka pocitadlo, podľa tejto schémy:

CREATE TABLE IF NOT EXISTS `pocitadlo` (

  `ip` varchar(45) NOT NULL,

  `cas` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`cas`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Skript pracuje nasledovne: Najskôr sa zistí počet návštev z predošlého dňa, resp. starších ako aktuálny. Ak také nájde, pripočíta sa tento počet do celkového počtu návštev, ktorý sa uchováva v tabuľke settings, ktorej štruktúra je individuálna podľa vašej stránky, takže ju nebudem uvádzať. Akonáhle je počet navýšený, zmažú sa údaje o návštevách z týchto predošlých dní.

Nová návšteva sa eviduje podľa desať minútového intervalu. Ak príde užívateľ na stránku a ubehlo viac ako 10 minút od jeho poslednej návštevy, započíta sa opäť (!$je_navsteva). Po tejto rutine sa zistí počet riadkov v tabuľke pocitadlo, t.j. počet návštev v aktuálnom dni. Ďalej celkový počet návštev z tabuľky settings, ktorý však udáva počet návštev bez aktuálneho dňa, teda pri výpise je k nemu tento údaj nutné pripočítať.

Aktuálny počet návštevníkov získame spočítaním riadkov, ktoré majú čas nie starší ako 10 minút. Na záver už len vypíšeme prehľad návštev celkovo, dnes a aktuálne.

Komentáre:
29.10.2015 14:18 [1] fisherko
Ako docielim zobrazovannie celkovej štatistiky zobrazenia pre každú podstránku samostatne?
Sú generované automaticky tak ako to máte tu,
29.12.2015 23:47 [2] admin
Počítadlo stránok samostatne mám napr. na Používam takýto kód: Najskôr načítam celý riadok v db, identifikátor článku je kľúč seo, napr. v tomto článku je to hore v adrese reťazec "pocitadlo-navstev-v-php-a-mysql". Potom si navýšim počet zobrazení o jedna. Počet zobrazení mám v db vedený pod stĺpcom 'displayed'. Potom už len zobrazím aktuálny počet na stránke. Nemusím ho opäť načítavať, využijem inkrementovanú hodnotu z predošlej operácie.
| web
Pridať príspevok

meno
e-mail (nutný pre zobrazenie gravatara)
web
opíšte číslo päť

v okne