Mange hits?

Hits : 133872
Hits dag : 22
Online : 1

HitCounter / Besøgs- og onlinetæller med PHP/MySQL
(v. 2008-08-17)

Download hele eksemplet som en køreklar fil (skal omdøbes til .php) counter.source.phps. [Downloads: 1351]

Om tællerne

Scriptet opdaterer to tabeller i MySQL: en tabel med nye hits (hit counter) og en tabel med antal aktive brugere (online counter). Antallet af besøg og antal brugere kan vises på hjemmesiden. Tælleren begrænser brugere så de maksimalt får et nyt hit hvert 20. minut (kan justeres). Desuden udelukkes søgerobotter så vidt som muligt fra at kunne få hits og være online, da disse ellers vil give et urealistisk billede af egentlige besøg på hjemmesiden. Du kan se det i funktion under menuen til venstre. Her er de to tællere samlet i en boks lavet med CSS.

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);
}
?>

» Til toppen