Einfacher Counter mit zeitbasierter Reloadsperre. Die Informationen werden in 2 Tabellen einer MySQL Datenbank abgelegt. Zur Funktion: Die IP Adresse des Besuchers wird ermittelt und mit einer Tabelle abgeglichen. Dort sind die IP's der Besucher abgelegt. IP's älter als 6 Stunden werden aus der Tabelle entfernt. Ist die aktuelle IP noch nicht vorhanden, so wird sie mit Besuchszeit eingetragen und der Counter erhöht.
Die Tabellen:
visitors(Zeit:BigInt,IP:Text)
hits(count:Int)
Source:
<?php
//**********************************************Counter*******************************************
mysql_connect("localhost","username","password");
$zeit_reloadsperre=21600; //6 Stunden Realoadsperre
$ip_schon_da=0; //Flag für die Reloadsperre
$ip_neu=getenv("REMOTE_ADDR"); //IP des Besuchers ermitteln
$result=mysql_db_query("database","Select * from visitors"); //Tabelle Visitors auslesen
$zeilen=mysql_Num_Rows($result);
$zeit_aktuell=time(); //aktuelle Zeit ermitteln
for($i=$zeilen; $i>0; $i--)
{
$a=$i-1;
$zeit_alt=mysql_Result($result,$a,"Zeit");
if(($zeit_aktuell-$zeit_alt)>$zeit_reloadsperre) //Zeitvergleich auf Basis von UNIX Timestamps
{
//Ip Eintrag entfernen, wenn zu alt
mysql_db_query("database","delete from visitors where $zeit_alt=Zeit");
}
else
{
//wenn nicht zu alt, IP vergleichen, wenn gefunden Flag setzen
$ip_alt=mysql_Result($result,$a,"IP");
if($ip_neu==$ip_alt) $ip_schon_da=1;
}
}
if($ip_schon_da==0) //wenn IP nicht in Tabelle, dann kann Counter erhöht werden
{
//Hits erhöhen
mysql_db_query("database","update hits set count=count+1");
//neuen Besucher eintragen
mysql_db_query("database","insert into visitors (Zeit,IP) values ($zeit_aktuell,'$ip_neu')");
//wenn 2 besucher zur gleichen sekunde registriert werden, dann sollten sie zumindest
//nicht die gleiche IP haben, :), weil Zeit+IP ist Primary Key
}
//aktuellen Counter auslesen
$result_hits=mysql_db_query("database","Select * from hits");
$anz_hits=mysql_Result($result_hits,0,"count");
//Counter anzeigen
echo "<BR><BR><center>Counter: $anz_hits</center>";
mysql_close();
?>