AW: Counter... was mach ich falsch ??
Ich habe ein Counter mit IP-Sperre in selfphp_4.2 gefunden, das müßte dein Problem lösen.
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 immer hin lässt sich hiermit der Besucherzähler wesentlich sinnvoller betreiben.
Das erforderliche Skript zur Umsetzung des Counters stellt sich, wie folgt dar:
<?
/////////////////////////////////////////
// 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($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($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);
?>
Wie Sie sehen setzt sich diese Lösung ä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 1 Minute lang aktiv, dies lässt sich mit Hilfe der Variablen $zeit natürlich ohne weiteres raufsetzen. Die durch die Funktion erzeugten Einträge innerhalb der ips.txt Datei setzen sich, wie folgt zusammen ipadresse|besuchszeit.
Beispiel - Zeile aus der ips.txt Datei
127.0.0.1|1075942181
Die Counter-Abfrage als auch die Ausgabeformatierung sind in Ihren wesentlichen Bestandteilen identisch mit den vorherigen Lösungen. Der Aufruf des Counters kann anschliessend 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, wie beispielsweise bei einem Gästebuch nützliche Dienste erweisen, um doppelte Einträge zu vermeiden.
Quelle: selfphp_4.2