Die dritte und letzte Variante eines Besucherzählers, die ich Ihnen vorstellen will, hat eine IP-Sperre. Diese IP-Sperre ermöglicht es Ihnen, den jeweiligen Besucher lediglich ein einziges Mal pro Besuch zu registrieren, und zwar für eine festgelegte Zeit. Natürlich stellt dies keinen absoluten Schutz vor Refresh-Aufrufen dar, aber immerhin lässt sich hiermit der Besucherzähler wesentlich sinnvoller betreiben.
Das erforderliche Skript zur Umsetzung des Counters sieht so aus:
<?php
/////////////////////////////////////////
// Counter + Reloadsperre v1.0
/////////////////////////////////////////
// 0=keine Reloadsperre, 1=Reloadsperre
$aktiv = 1;
// Zeit der Reloadsperre in Minuten
$zeit = 1;
// IP-Datei
$ipdatei = "ips.txt";
// Counterdatei
$datei = "counter.txt";
// Anzahl der führenden Nullen
$stellen = 5;
// Festlegen der Bild-Dimensionen
$breite="15";
$hoehe="19";
/////////////////////////////////////////
// IP-Reloadsperre
/////////////////////////////////////////
function pruf_IP($rem_addr) {
global $ipdatei,$zeit;
@$ip_array = file($ipdatei);
$reload_dat = fopen($ipdatei,"w");
$this_time = time();
for ($i=0; $i<count($ip_array); $i++) {
list($ip_addr,$time_stamp) = explode("|",$ip_array[$i]);
if ($this_time < ($time_stamp+60*$zeit)) {
if ($ip_addr == $rem_addr) {
$gefunden=1;
}
else {
fwrite($reload_dat,"$ip_addr|$time_stamp");
}
}
}
fwrite($reload_dat,"$rem_addr|$this_time\n");
fclose($reload_dat);
return ($gefunden==1) ? 1 : 0;
}
/////////////////////////////////////////
// Counter-Abfrage
/////////////////////////////////////////
if (file_exists($datei) && ($aktiv==0 || ($aktiv==1 && pruf_IP($_SERVER['REMOTE_ADDR'])==0))) {
// Falls die Datei existiert, wird sie ausgelesen und
// der dort enthaltene Wert um Eins erhöht.
$fp=fopen($datei,"r+");
$zahl=fgets($fp,$stellen);
$zahl++;
rewind($fp);
flock($fp,2);
fputs($fp,$zahl,$stellen);
flock($fp,3);
fclose($fp);
}else if (!file_exists($datei) && ($aktiv==0 || ($aktiv==1 && pruf_IP($_SERVER['REMOTE_ADDR'])==0))) {
// Die Datei counter.txt existiert nicht, sie wird
// neu angelegt und mit dem Wert 1 gefüllt.
$fp=fopen($datei,"w");
$zahl="1";
fputs($fp,$zahl,$stellen);
fclose($fp);
} else {
// Die Datei existiert zwar, jedoch handelt
// es sich wahrscheinlich um den gleichen Besucher
$fp=fopen($datei,"r");
$zahl=fgets($fp,$stellen);
fclose($fp);
}
$zahl=sprintf("%0".$stellen."d",$zahl);
?>
Diese Lösung setzt sich ähnlich zusammen wie der Text- bzw. Grafikcounter. Es ist lediglich eine Funktion pruf_IP() hinzugekommen, die Sie in die Lage versetzt, die jeweilige IP-Adresse des Besuchers und die Besuchszeit zu speichern. Hierzu wird eine Textdatei ips.txt angelegt, in dieser befinden sich sämtliche Besucher-IPs samt Besuchszeiten. Die Reloadsperre ist für jeden Besucher eine Minute lang aktiv. Dies lässt sich mithilfe der Variablen $zeit natürlich ohne Weiteres verlängern. Die durch die Funktion erzeugten Einträge innerhalb der ips.txt-Datei setzen sich wie folgt zusammen: ipadresse|besuchszeit.{PSP}Beispiel – Zeile aus der ips.txt-Datei
127.0.0.1|1075942181
Die Counter-Abfrage und auch die Ausgabeformatierung sind in ihren wesentlichen Bestandteilen identisch mit den vorherigen Lösungen. Der Aufruf des Counters kann anschließend aus jedem beliebigen PHP-Skript Ihrer Website erfolgen und zwar, wie folgt:
Beispiel – Textcounter
<?php
include("counter.php");
echo "<font face=Arial color=blue size=5>$zahl</font>";
?>
Beispiel – Grafikcounter
<?php
include("counter.php");
// Hier wird dann der Zähler aus Bildern zusammengesetzt
for($i=0;$i<$stellen;$i++){
$bild_counter=$bild_counter . "<img src=bilder/" . substr($zahl,$i,1) . ".gif align=absmiddle width=$breite height=$hoehe>";
}
echo $bild_counter;
?>
Tipp: Nehmen Sie sich genügend Zeit, um sich mit der IP-Sperre zu befassen. Diese Funktion kann Ihnen auch für weitere Anwendungen, beispielsweise bei einem Gästebuch, nützliche Dienste erweisen, um doppelte Einträge zu vermeiden.