Besøgs- og onlinetæller (v. 2008-08-17)
Download hele eksemplet som en køreklar fil (skal omdøbes til .php) counter.source.phps. [Downloads: 523]
Om tællerne
Dette script opdaterer en tabel i MySQL med nye hits og en tabel med online og retunerer antallet af nye besøg samt antal online på en hjemmeside. Tælleren begrænser brugere så de maks. får et nyt hit f.eks. hvert 20. minut (kan ændres). Desuden udelukkes søgerobotter så vidt som muligt fra at kunne få hits/være online da disse eller vil give et urealistisk billede af egentlige besøg på ens side. Du kan se det i funktion under menuen til venstre
MySQL-tabeller til opbevaring af besøgende.
Før tællerne kan komme til at fungere skal du oprette to tabeller med følgende strukturer i din MySQL-database via f.eks. phpMyAdmins SQL-afdeling. Den første tabel bruges til antal hits på siden mens den anden til antal brugere online samtidig:
CREATE TABLE IF NOT EXISTS `hits` ( `id` int(11) NOT NULL auto_increment, `ip` varchar(20) NOT NULL, `time` datetime NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `online` ( `id` int(11) NOT NULL auto_increment, `ip` varchar(20) NOT NULL, `time` datetime NOT NULL, PRIMARY KEY (id), UNIQUE (ip) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
Besøgstæller
Besøgstælleren er klar til at blive vidst ved at kalde funktionen hits($ventetid). Funktionen kaldes med argumentet $ventetid som angives i sekunder. Denne ventetid begrænser brugere (på deres IP-adresse) så de max får et nyt hit på tælleren efter det fastsatte antal sekunder. I Funktionen skal der blot ændres de fire værdier til forbindelse til din MySQL-database - HOST-navnet til databasen, dit BRUGERNAVN, dit PASSWORD og din DATABASES NAVN (er hos nogle udbydere det samme som dit brugernavn). Se i koden nedenfor. Koden kan f.eks. gemmes i en fil med navnet »hit_counter.php«.
hit_counter.php
<?php
/**
* Hit/Online Counter with PHP and MySQL
* Version: 2008-08-17 23:25:00
* Author: Christian L. Dünweber
* Webpage: http://www.dunweber.com/docs/scripts/#taeller
* Copyright (C) 2007-2008 Christian L. Dünweber
* This program is distributed under the GNU General Public License,
* see <http://www.gnu.org/licenses/gpl.html>.
*/
// Besøgsttællerfunktionen kaldes med et argument i sekunder, f.eks. én time = 3600 sekunder.
// Argumentet begrænser brugere så de max får et nyt hit efter det fastsatte antal sekunder
echo hits("3600");
/**
* Besøgsttællerfunktionen som benytter MySQL-tabellen "hits".
*/
function hits($ventetid) {
# Ændrer nedenstående fire til din databases værdier
$link = mysql_connect("HOST","BRUGERNAVN","PASSWORD");
mysql_select_db("DATABASENAVN_EVT_BRUGERNAVN");
# Snupper brugerens IP-adresse og user-agent-navn
$ip = $_SERVER["REMOTE_ADDR"];
$agent = $_SERVER["HTTP_USER_AGENT"];
# Der tjekkes om brugeren skulle være en søgerobot der ikke skal indsættes og give hit
# Der kan tilføjes andre søgerobotter ved at tilføje |robotnavn i udtrykket
if(preg_match("/Googlebot|MSNBot|Scooter|WebCrawler|Slurp|Lycos_Spider/i",$agent) > 0) {
# Sender en query der bruges til af afgøre om det er brugerens første besøg eller om
# en tidligere bruger genbesøger siderne efter den fastsatte minimumsventetid. Det foregår
# vha. funktionen date_add der kan addere to tidspunkter og funktionen NOW() der
# retunerer det nuværende tidspunkt.
$ny_bruger = mysql_query("SELECT COUNT(*) FROM hits WHERE ip='$ip' ".
"AND date_add(time,interval $ventetid SECOND) > NOW()");
# Hvis der ikke var noget svar fra ovenstående query, er det brugerens første besøg
# eller et tgenbesøgtt efter den fastsatte, begrænsene ventetid, og han/hun indsættes
# igen i tabellen med IP og nuværende tidspunkt
if(!mysql_result($ny_bruger,0)) {
mysql_query("INSERT INTO hits SET time=NOW(), ip='$ip'");
}
# Ved sideskift/reload inden for det fastsatte tidsrum opdateres brugerens besøgstidpunkt
# til tidspunktet for sideskiftet
$resultat = mysql_query("SELECT id FROM hits WHERE ip='$ip' ".
"AND date_add(time,interval $ventetid SECOND) > NOW()");
# Ekstraherer brugerens seneste id i tabellen så tidspunktet opdateres for dette id og
# ikke alle brugerens id'er - hvis han har været på siderne mere end én gange.
if($resultat) {
while($raekke = mysql_fetch_array($resultat)) {
extract($raekke);
$ids[] = $id;
}
sort($ids);
$senete_id = $ids[count($ids)-1];
mysql_query("UPDATE hits SET time=NOW() WHERE ip='$ip' AND id='$senete_id'");
}
}
# Antal hits optælles som antallet af rækker i tabellen
$hits = mysql_query("SELECT COUNT(*) FROM hits");
mysql_close($link);
return "Hits: " . mysql_result($hits,0);
}
?>
Onlinetæller
Onlinetælleren er også klar til at blive vidst ved at kalde funktionen online($onlinetid). Funktionen kaldes med argumentet $onlinetid som angives i sekunder. Denne onlinetid gør at brugeren står som online i f.eks. 5 minutter som minimum. I denne funktion skal der også ændres de fire værdier til forbindelse til din MySQL-database - HOST-navnet til databasen, dit BRUGERNAVN, dit PASSWORD og din DATABASES NAVN (er hos nogle udbydere det samme som dit brugernavn). Se i koden nedenfor. Koden kan f.eks. gemmes i en fil med navnet »online_counter.php«.
online_counter.php
<?php
/**
* Hit/Online Counter with PHP and MySQL
* Version: 2008-08-17 23:25:00
* Author: Christian L. Dünweber
* Webpage: http://www.dunweber.com/docs/scripts/#taeller
* Copyright (C) 2007-2008 Christian L. Dünweber
* This program is distributed under the GNU General Public License,
* see <http://www.gnu.org/licenses/gpl.html>.
*/
// Onlinetællerfunktionen kaldes med et argument i sekunder, f.eks. 5 minutter = 300 sekunder
// Argumentet gør at brugeren står som online i det fastsatte antal sekunder
echo online("300");
/**
* Onlinetællerfunktionen som benytter MySQL-tabellen "online".
*/
function online($onlinetid) {
# Ændrer nedenstående fire til din databases værdier
$link = mysql_connect("HOST","BRUGERNAVN","PASSWORD");
mysql_select_db("DATABASENAVN_EVT_BRUGERNAVN");
# Snupper brugerens IP-adresse og user-agent-navn
$ip = $_SERVER["REMOTE_ADDR"];
$agent = $_SERVER["HTTP_USER_AGENT"];
# Der tjekkes om brugeren skulle være en søgerobot der ikke skal indsættes og give hit
# Der kan tilføjes andre søgerobotter ved at tilføje |robotnavn i udtrykket
if(preg_match("/Googlebot|MSNBot|Scooter|WebCrawler|Slurp|Lycos_Spider/i",$agent) > 0) {
# Er brugeren i tabellen?
$ny_bruger = mysql_query("SELECT null FROM online WHERE ip='$ip'");
# Hvis ikke så indsættes han/hun ellers opdateres brugerens tidpunkt til nu
if(!mysql_result($ny_bruger,0)) {
mysql_query("INSERT INTO online SET time=NOW(), ip='$ip'");
} else {
mysql_query("UPDATE online SET time=NOW() WHERE ip='$ip'");
}
}
# Brugere der ikke har foretaget sig noget i den fastsatte onlinetid slettes
# fra tabellen
mysql_query("DELETE FROM online WHERE date_add(time,interval $onlinetid SECOND)<NOW()");
# Antal online tælles aom antallet af rækker i tabellen
$online = mysql_query("SELECT COUNT(*) FROM online");
if(!$online) {
$online = 1;
}
mysql_close($link);
return "Online : " . mysql_result($online,0);
}
?>
Disse to tællere kan jo eventuelt samles til en som jeg har gjort her på mine sider (til venstre under menuerne). Så må man bare være lidt kreativ i sit stylesheet.




PHP-scriptsforsiden