PHP-scripts

Hits: 147751
Hits dag : 54
Online : 1

HitCounter / Besøgs- og onlinetæller med PHP/MySQL
(v. 2018-10-04)

Download Source Code

counter.source.phps [Downloads: 1546]

Filen skal omdøbes til .php for at kunne køres.

Om tællerne

Scriptet opdaterer to tabeller i MySQL: en med nye hits (hits) og en med antal aktive brugere (online). Dette bruges til at vise det totale antal besøg samt antallet af brugere som er online samtidig på hjemmesiden. Hittælleren begrænser brugere så de maksimalt får et nyt hit hvert 20. minut og online-tælleren ser samme bruger som aktiv hvis der foretages navigation eller reload inden for 5. minutter (begge kan ændres). 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 her på hjemmesiden, hvor de to tællere samlet i en boks.

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-input:

MySQL-tabel til hits

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)
) AUTO_INCREMENT=1;

MySQL-tabel til online

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)
) 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, dit BRUGERNAVN, dit PASSWORD og din DATABASES NAVN (er hos nogle hosts 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: 2018-10-04 11:37:00
 * Webpage: http://www.dunweber.com/docs/scripts/#taeller
 * Copyright (C) 2007-2018 Christian L. Dünweber
 * This program is distributed under the GNU General Public License,
 * see <http://www.gnu.org/licenses/gpl.html>.
 */

// Kalder funktionen som viser hits begrænset til max. et nyt hit pr. IP pr. time
echo hits("3600")."<br/>";

/**
 * Besøgsttællerfunktionen som benytter MySQL-tabellen "hits".
 * @param $ventetid Tid i sekunder før en online bruger igen betragtes som et nyt hit.
 */
function hits($ventetid) {
    
// Ændrer nedenstående fem til din databases værdier
    
$link mysqli_connect("HOST""BRUGERNAVN""PASSWORD""DATABASE");
    
$table "hits";

    if (!
$link) {
        exit(
"Kunne ikke forbinde to MySQL: ".mysqli_connect_errno());
    }

    
// Brugerens IP-adresse og user agent-navn
    
$ip $_SERVER["REMOTE_ADDR"];
    
$agent $_SERVER["HTTP_USER_AGENT"];

    
// Tjek om brugeren skulle være en søgerobot der ikke skal give falske hits
    // Tilføj eventuelt andre søgerobotter
    
if (preg_match("/Googlebot|MSNBot|Scooter|WebCrawler|Slurp|Lycos_Spider/iu"$agent) === 0) {

        
// Query til at afgøre om det er brugerens første besøg eller om det er et genbesøg
        
$resultat mysqli_query($link"SELECT id FROM $table WHERE ip='$ip' AND date_add(time, interval $ventetid SECOND) > NOW()");
        
$nyt_hit mysqli_fetch_assoc($resultat);
        
        
// Hvis query ikke giver noget resultat indsættes IP i tabellen med tidsstempel
        
if (!$nyt_hit) {
            
mysqli_query($link"INSERT INTO $table SET time=NOW(), ip='$ip'");
        }
        
// Hvis brugeren er ved at browser/reloade opdateres tidsstempel for IPen blot
        
else {
            
mysqli_query($link"UPDATE $table SET time=NOW() WHERE ip='$ip' AND id='".$nyt_hit['id']."'");
        }
    }

    
// Antal hits optælles som det totale antal rækker i tabellen
    
$resultat mysqli_query($link"SELECT COUNT(*) AS hits FROM $table");
    
$hits mysqli_fetch_assoc($resultat);

    
mysqli_free_result($resultat);
    
mysqli_close($link);

    return 
"Hits: " $hits["hits"];
}
?>

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, dit BRUGERNAVN, dit PASSWORD og din DATABASES NAVN. Koden kan f.eks. gemmes i en fil med navnet »online_counter.php«.

online_counter.php

<?php
// Kalder funktionen som viser online således at IPer online i 5 minutters intervaller
echo online("300")."<br/>";

/**
 * Onlinetællerfunktionen som benytter MySQL-tabellen "online".
 * @param $onlinetid Tid i sekunder før en online bruger ikke betragtes som online mere.
 */
function online($onlinetid) {
    
// Ændrer nedenstående fem til din databases værdier
    
$link mysqli_connect("HOST""BRUGERNAVN""PASSWORD""DATABASE");
    
$table "online";

    if (!
$link) {
        exit(
"Kunne ikke forbinde to MySQL: ".mysqli_connect_errno());
    }

    
// Brugerens IP-adresse og user agent-navn
    
$ip $_SERVER["REMOTE_ADDR"];
    
$agent $_SERVER["HTTP_USER_AGENT"];

    
// Tjek om brugeren skulle være en søgerobot der ikke skal give falske hits
    // Tilføj eventuelt andre søgerobotter
    
if (preg_match("/Googlebot|MSNBot|Scooter|WebCrawler|Slurp|Lycos_Spider/iu"$agent) === 0) {

        
// Er brugeren i tabellen?
        
$resultat mysqli_query($link"SELECT null FROM $table WHERE ip='$ip'");
        
$ny_bruger mysqli_fetch_row($resultat);
        
        
// Hvis ikke så indsættes denne, ellers opdateres brugerens tidpunkt til nu
        
if (!$ny_bruger) {
            
mysqli_query($link"INSERT INTO $table SET time=NOW(), ip='$ip'");
        }
        else {
            
mysqli_query($link"UPDATE $table SET time=NOW() WHERE ip='$ip'");
        }
    }

    
// Brugere der ikke har foretaget sig noget slettes fra tabellen
    
mysqli_query($link"DELETE FROM $table WHERE date_add(time,interval $onlinetid SECOND) < NOW()");

    
// Antal online tælles aom antallet af rækker i tabellen
    
$resultat mysqli_query($link"SELECT COUNT(*) AS online FROM $table");
    
$row mysqli_fetch_assoc($resultat);
    
$online = ($row["online"] == $row["online"]); // Der er altid mindst én online hvis dette vises

    
mysqli_free_result($resultat);
    
mysqli_close($link);

    return 
"Online : " $online;
}
?>