SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=229&group=39
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Counter mit IP-Sperre


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.