Te-ai intrebat vre-odata cati vizitatori sunt online la un moment dat pe site-ul tau In acest tutorial vom analiza o metoda efectiva de a afisa numarul total de vizitatori online pe site.
Variabila $sessionTimeInMin reprezinta numarul de minute ce trebuie sa treaca inainte de a reseta contorul. Un vizitator nu mai este luat in calcul doar daca nu a realizat nici o actiune in intervalul de minute mai sus mentionat. Incepem prin a crea o clasa care se va ocupa de statisticile noastre.
<?php class VisitorCounter { var $sessionTimeInMin = 5; } ?>
Functia constructoare a clasei va actualiza basa de date stergand vizitatorii inactivi si adaugand / actualizand restul de vizitatori.
public function VisitorCounter() { $ip = $_server['REMOTE_ADDR']; $this->cleanVisitors(); if ($this->visitorExists($ip)) { $this->updateVisitor($ip); } else { $this->addVisitor($ip); } }
Acum cream functia care se va ocupa strict de sterge vizitatorilor inactivi in perioada X de minute
private function cleanVisitors() { $sql = "select * from counter"; $res = Mysql_query($sql); while ($row = mysql_fetch_array($res)) { if (time() - $row['lastvisit'] >= $this->sessionTimeInMin * 60) { $dsql = "delete from counter where id = $row[id]"; mysql_query($dsql); } } }
Urmeaza functia care se ocupa de verificarea vizitatorilor in baza de date. Daca un vizitator nu este in baza de date va returna false
public function visitorExists($ip) { $sql = "select * from counter where IP = '$ip'"; $res = mysql_query($sql); if (mysql_num_rows($res) > 0) { return true; } else if (mysql_num_rows($res) == 0) { return false; } }
Urmatoara functie va actualiza un vizitator daca acesta exista in baza de date
private function updateVisitor($ip) { $sql = "update counter set lastvisit = '" . time() . "' where ip = '$ip'"; mysql_query($sql); }
Functia care urmeaza se va ocupa de adaugarea unui vizitator daca acesta nu exista in baza de date
private function addVisitor($ip) { $sql = "insert into counter (ip ,lastvisit) value('$ip', '" . time() . "')"; mysql_query($sql); }
Acum aflam numarul de vizitatori din baza de date online pe site
public function getAmountVisitors() { $sql = "select count(id) from counter"; $res = mysql_query($sql); $row = mysql_fetch_row($res); return $row[0]; }
Urmatoarea bucata de cod se va ocupa de afisarea efectiva a counter-ului in pagina
public function show() { echo '<div style="padding:5px; margin:auto; background-color:#fff"><b>' . $this->getAmountVisitors() . 'visitors online</b></div>'; }
In final vom obtine un script php pe care il poti salva de exmplu ca Counter.class.php al carui cod arata dupa cum urmeaza:
<?php class VisitorCounter { var $sessionTimeInMin = 5; // time session will live, in minutes public function VisitorCounter() { $ip = $_SERVER['REMOTE_ADDR']; $this->cleanVisitors(); if ($this->visitorExists($ip)) { $this->updateVisitor($ip); } else { $this->addVisitor($ip); } } public function visitorExists($ip) { $sql = "select * from counter where ip = '$ip'"; $res = mysql_query($sql); if (mysql_num_rows($res) > 0) { return true; } else if (mysql_num_rows($res) == 0) { return false; } } private function cleanVisitors() { $sessionTime = 30; $sql = "select * from counter"; $res = mysql_query($sql); while ($row = mysql_fetch_array($res)) { if (time() - $row['lastvisit'] >= $this->sessionTimeInMin * 60) { $dsql = "delete from counter where id = $row[id]"; mysql_query($dsql); } } } private function updateVisitor($ip) { $sql = "update counter set lastvisit = '" . time() . "' where ip = '$ip'"; mysql_query($sql); } private function addVisitor($ip) { $sql = "insert into counter (ip ,lastvisit) value('$ip', '" . time() . "')"; mysql_query($sql); } public function getAmountVisitors() { $sql = "select count(id) from counter"; $res = mysql_query($sql); $row = mysql_fetch_row($res); return $row[0]; } public function show() { echo '<div style="padding:5px; margin:auto; background-color:#fff"><b>' . $this->getAmountVisitors() . 'visitors online</b></div>'; } } ?>
Utilizarea counter-ului se face foarte simplu utilizand doar 3 linii de cod
<?php require "Counter.class.php"; // the counter class itself $counter = new VisitorCounter; $counter->show(); ?>