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
21.02.2020 04:31 [3] Dušan
Dobrá filozofia skriptu, len by bolo dosť vhodné spomenúť, že skript používa 2 tabuľky (spomenutá je iba jedna). Navyše skript mi nepracoval správne: po polnoci zdvojnásobil počet návštev z predchádzajúceho dňa a tento údaj zapísal do tabuľky (nelogicky nazvanej 'settings') ako celkový počet návštev.
Takže nižšie pridávam celý upravený a funkčný skript. Databáza sa pripája cez includovaný súbor 'daba.php' a nezabudnúť vytvoriť ešte jednu tabuľku s menom 'settings' a stĺpcom 'návštev'.

<html>
<head>
<title>Návštevy/title>
<link rel="shortcut icon" href="img/favicon.ico">
<link rel="STYLESHEET" type="text/css" href="style.css">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<meta name="robots" content="noindex">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=no">
<meta name="MobileOptimized" content="320">
</head>
<body>
<?php
//https://gympeljj.php5.sk/?article=pocitadlo-navstev-v-php-a-mysql

include "daba.php";

mysql_connect($localhost, $user, $password)
or die("Nepodarilo sa pripojiť k databáze");

mysql_select_db($databaza)
or die("Nepodarilo sa zvoliť databázu");

$q = mysql_query("select count(*) from pocitadlo where cas < curdate()");
list($starsie_ako_dnes) = mysql_fetch_row($q);

if ($starsie_ako_dnes)
{
$q = mysql_query("select navstev from settings");
list($navstev_celkom) = mysql_fetch_row($q);
$q = mysql_query("select count(*) from pocitadlo");
list($navstev_dnes) = mysql_fetch_row($q);
$spolu = $navstev_celkom + $starsie_ako_dnes;
mysql_query("update settings set navstev = $spolu where 1");
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()) <= 15");
list($je_navsteva) = mysql_fetch_row($q);
if (!$je_navsteva) mysql_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 navstev from settings");
list($navstev_celkom) = mysql_fetch_row($q);
$navstev_celkom += $navstev_dnes;

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


echo "<div style='position: relative; top: -20px'>";
echo "<div><small><b>Návštevy</b> - celkom:<b> $navstev_celkom </b>| dnes:<b> $navstev_dnes </b>| online:<b> $online</b></smal>";
echo "</div>";

mysql_close($q);
?>
</body>
</html>
21.02.2020 04:39 [4] Dušan
Ešte doplním: ten súbor 'daba.php' obsahuje iba naplnenie premenných $localhost, $user a $password.
Výpis výsledkov na konci skriptu mám hodne posunutý vyššie:
echo "<div style='position: relative; top: -20px'>";
takže tento riadok treba nahradiť iba riadkom:
echo "<div>";
Oproti autorovmu skriptu som pridal aj uzavretie pripojenia k databáze:
mysql_close($q);
Možno by bolo vhodné vyriešiť pripájanie a odpájanie k databáze nejakou session, aby sa všetko urýchlilo a zbytočne nedochádzalo k tomu pripájaniu a odpájaniu.
Pridať príspevok

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

v okne