Counter

<?PHP
error_reporting(E_ALL ^E_NOTICE);
############################################################################
#  um-Counter Skript V1.00                                                 #
#  zur freien Verwendung, d. h. keinerlei Lizenzen oder Copyright          #
#  ein Backlink wäre aber nett!                                            #
#  Auf jeden Fall aber bitte diesen Tag im XHTML Template einbinden:       #
#  <meta name="Generator" content="script by http://um-fritz.de" />        #
#  Danke und viel Spaß!                                                    #
#  http://um-fritz.de                                                      #
############################################################################

#############        START KONFIGURATIONSTEIL     ##########################
#  Angabe der Stunden, für die IP's geblockt bleiben                       
define("IP_BLOCKTIME_H", 1);

#  Hier den Pfad angeben, relativ zur PHP-Datei, welche dieses Skript      
#  inkludiert. (require_once). Liegen diese Dateien im gleichen Verzeichnis,
#  kann diese Konstante leer bleiben. [Beispiel: define("PFAD", "foo/bar/");
define("PFAD", "");
#  Anzahl der Einträge in der IP Liste. Wenn sie ungefähr abschätzen       
#  können, wieviele Besucher durchschnittich pro Stunde ihre Seite Besuchen,
#  dann multiplizieren Sie diese Zahl mit der für IP_BLOCKTIME_H angegebenen
#  Zahl + ca. 20% Puffer. Je kürzer diese Liste, umso schneller das Skript 
define("LENGTH_IP_LIST", 100);

#  Hier können Sie bestimmen ob die Anzeige als Text oder als Grafik       
#  erfolgen soll. Mögliche Werte: "text" "grafik"                          
define("COUNTER_STYLE", "grafik");

#  Hier können Sie bestimmen ob die Anzeige vorgegebene Stellenanzahl haben
#  soll. Bei 0 werden z. B. nur die Ziffern der Zugriffe ausgegeben, bei 6 
#  z.B. immer 6 Stellen, auch bei z.B. 5 Einträgen, etwa: 5 oder 000005.   
#  Interessant vielleicht bei der Ausgabe in einem grafischen Interface    
define("SHOW_LENGTH", 7);

#  Hier das Grafikformat der Zifferngrafiken als Dateiendung angeben, Groß-
#  und Kleinschreibung beachten! Möglich wären z. B. "png" "gif" "jpg"     
#  "jpeg" oder Ähnliches.                                                  
define("GRAFIK_FORMAT", "gif");

#  Das war's, der Rest sollte automatisch gehen. Nur nicht  vergessen, den 
#  Textdateien im Unterverzeichnis /counter_files ausreichende Lese- und   
#  Schreibrechte zu geben. (chmod 0666)                                    
#############        ENDE KONFIGURATIONSTEIL      ##########################

############################################################################

#############        START SKRIPTTEIL      #################################

#Wenn Referer von dieser Domain oder Cookie gesetzt counter ausgeben
if (preg_match("@{$_SERVER['HTTP_HOST']}@", $_SERVER['HTTP_REFERER']) ||
    $_COOKIE['counter'] == "true") {
    $ausgabe = show_counter();
} else { #Kein Cookie oder kein || fremder Referer: ggf. Cookie setzten, IP ermitteln&abgleichen, ggf. IP Liste aufräumen
  if (empty($_COOKIE['counter'])) {
    setcookie("counter", "true", time()+IP_BLOCKTIME_H*3600, "/", ".{$_SERVER['HTTP_HOST']}");
  }
  $ip = get_ip();
  $ip_exists = check_ip_list($ip);
  #Wenn neuer Zugriff, counter erhöhen und speichern
  if ($ip_exists == false) {
   increase_save_count();
  }
  #Counter Anzeigen
  $ausgabe = show_counter();
}

#############        ENDE SKRIPTTEIL      #################################

############################################################################
#                            FUNKTIONEN                                    #
############################################################################

function get_ip() {
  unset($ip);
  if ($_SERVER['HTTP_X_FORWARDED_FOR']) {
    $temp = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
    $ip = $temp[0];
  } else {
    if ($_SERVER['HTTP_CLIENT_IP']) {
      $ip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
      $ip = $_SERVER['REMOTE_ADDR'];
    }
  }
  if (preg_match("@\d+\.\d+\.\d+\.\d+@is", $ip)) {
    return($ip);
  } else {
    return("0.0.0.0");
  } 
}

function check_ip_list($ip) {
  if (!file_exists(PFAD."counter_files/ip_list-men.txt")) {
    error("no_counter_file");
  } else {
    $ip_listing = file(PFAD."counter_files/ip_list-men.txt");
  }
  $parent_time = time();
  #Wenn ip_liste länger LENGTH_IP_LIST, Einträge älter als IP_BLOCKTIME_H*3600 löschen
  if (count($ip_listing) > LENGTH_IP_LIST) {
    $update = false;
    foreach ($ip_listing as $key => $wert) {
      $save_time = trim(preg_replace("@ \+\+ (.*)@", "", $wert));
      if (($parent_time - $save_time) > (IP_BLOCKTIME_H*3600)) {
        unset($ip_listing[$key]);
        $update = true;
      }
    }
    if ($update == true) {
      $new_ip_list = $ip_listing;
      $new_ip_line = "";
      save_to_ip_list($new_ip_list, $new_ip_line);
    } 
  }
  #Wenn ip_liste leer ist IP speichern und false zurück
  if(empty($ip_listing)) {
    $new_ip_list = "";
    $new_ip_line = trim($parent_time)." ++ ".trim($ip);
    save_to_ip_list($new_ip_list, $new_ip_line);
    return(false);
  } else { #Wenn ip_liste nicht leer ist, Liste durchgehen:
    #Wenn IP noch nicht gespeichert, $ip_gefunden = false; timestamp_update = false
    $ip_gefunden = false;
    $timestamp_update = false;
    foreach ($ip_listing as $key => $wert) {
      $saved_ip = trim(preg_replace("@\d+ \+\+@is", "", $wert));
      #Wenn IP in Liste gefunden wird $ip_gefunden=true
      if ($ip == $saved_ip) {
        $ip_gefunden = true;
        #Wenn Alter des Eintrages älter als IP_BLOCKTIME_H*3600: $timestamp_update = true;
        $save_time = trim(preg_replace("@ \+\+ (.*)@", "", $wert));
        if (($parent_time - $save_time) > (IP_BLOCKTIME_H*3600)) {
          $timestamp_update = true;
          $ip_entry = $key;
        }
      break;#IP gefunden und auf update überprüft, foreach kann abbrechen
      }
    }
  }
  #IP gefunden:
  if ($ip_gefunden == true) {
    if ($timestamp_update == true) { #aber nicht mehr zeitgeblockt
      array_splice($ip_listing, $ip_entry, 1);
      $new_ip_list = $ip_listing;
      $new_ip_line = trim($parent_time)." ++ ".trim($ip);
      save_to_ip_list($new_ip_list, $new_ip_line);
      $ip_exists = false;
    } else { #IP wurde gefunden und ist zeitgeblockt
      $ip_exists = true;
    }
  } else { #IP nicht gefunden
    $new_ip_list = $ip_listing;
    $new_ip_line = trim($parent_time)." ++ ".trim($ip);
    save_to_ip_list($new_ip_list, $new_ip_line);
    $ip_exists = false;
  }
  return($ip_exists);
}

function save_to_ip_list($new_ip_list, $new_ip_line) {
  if (!file_exists(PFAD."counter_files/ip_list-men.txt")) {
    error("no_ip_list_file");
  } elseif (!is_writable(PFAD."counter_files/ip_list-men.txt")) {
    error("ip_list_unwriteable");
  } else {
    if (is_array($new_ip_list)) {
      foreach($new_ip_list as $key => $wert) {
        $update_ip_list .= trim($wert)."\n";
      }
    } else {
      $update_ip_list = $new_ip_list;
    }
    if (isset($new_ip_line)) {
      $update_ip_list .= $new_ip_line;
      $_SERVER['ip_saved'] = true;
    }
    $fh = fopen(PFAD."counter_files/ip_list-men.txt","wb");
    flock($fh, LOCK_EX);
    fwrite($fh, $update_ip_list);
    fclose($fh);
  }
  return;
}

function increase_save_count() {
  if (!file_exists(PFAD."counter_files/count-men.txt")) {
    error("no_counter_file");
  } elseif (!is_writable(PFAD."counter_files/count-men.txt")) {
    error("count_unwriteable");
  } else {
    $counts = file(PFAD."counter_files/count-men.txt");
    $count  = trim($counts[0]);
    $count++;
    $fh = fopen(PFAD."counter_files/count-men.txt","wb");
    flock($fh, LOCK_EX);
    fwrite($fh, $count);
    fclose($fh);
  }
  return;
}

function show_counter() {
global $ip;
  if (!file_exists(PFAD."counter_files/count-men.txt")) {
    error("no_counter_file");
  }
  $counterlines = file(PFAD."counter_files/count-men.txt");
  $zero_length = (string) trim($counterlines[0]);
  $lead_zero = SHOW_LENGTH - strlen($zero_length);
  if (COUNTER_STYLE == "grafik") {  #Grafische Ausgabe:
    $grafik_format = GRAFIK_FORMAT;
    if (SHOW_LENGTH > strlen($zero_length)) {
      for ( $i = 0; $i < $lead_zero; $i++) {
        $bild_info = getimagesize(PFAD."counter_files/0.".GRAFIK_FORMAT);
        $zero_grafik .="<img src=\"".PFAD."counter_files/0.".GRAFIK_FORMAT."\" {$bild_info[3]} alt=\"0\" />";
      }
    }
    for($i = 0; $i < strlen($zero_length); $i++) {
      $bild_info = getimagesize(PFAD."counter_files/{$zero_length[$i]}.".GRAFIK_FORMAT);
      $grafik .= "<img src=\"".PFAD."counter_files/{$zero_length[$i]}.".GRAFIK_FORMAT."\" {$bild_info[3]} alt=\"{$zero_length[$i]}\" />";
    }
    $count = $zero_grafik.$grafik;
    #Grafische Ausgabe der IP
    if ($_SERVER['ip_saved'] == false) {
      $bild_info = getimagesize(PFAD."counter_files/none.$grafik_format");
      $ip_show .= "<img src=\"".PFAD."counter_files/none.$grafik_format\" {$bild_info[3]} alt=\"Keine\" />";
    } else {
      for($i = 0; $i < strlen($ip); $i++) {
        if ($ip[$i] == ".") {
          $bild_info = getimagesize(PFAD."counter_files/dot.$grafik_format");
          $ip_show .= "<img src=\"".PFAD."counter_files/dot.$grafik_format\" {$bild_info[3]} alt=\".\" />";
        } else {
          $bild_info = getimagesize(PFAD."counter_files/{$ip[$i]}.$grafik_format");
          $ip_show .= "<img src=\"".PFAD."counter_files/{$ip[$i]}.$grafik_format\" {$bild_info[3]} alt=\"{$ip[$i]}\" />";
        }
      }
    }
  } else {  #Textausgabe
    if (SHOW_LENGTH > strlen($zero_length)) {
      for ( $i = 0; $i < $lead_zero; $i++) {
        $text .="0";
      }
    }
    $text .= (string) trim($counterlines[0]);
    $count = $zero_text.$text;
    #Textausgabe IP
    if ($_SERVER['ip_saved'] == false) {
      $ip_show = "Keine";
    } else {
      $ip_show .= $ip;
    }
  }
  $ausgabe['count']   = $count;
  $ausgabe['ip-show'] = $ip_show;
  unset($_SERVER['ip_saved']);
  return($ausgabe);
}

function error($error_code) {
  $error_msg = "<h1>Fehlermeldung:</h1>\n";
  switch ($error_code) {
    case "no_counter_file" :
    $error_msg .= "<p>Die Datei ".PFAD."counter_files/count-men.txt existiert nicht!</p>";
    break;
    case "count_unwriteable" :
    $error_msg .= "<p>Die Datei ".PFAD."counter_files/count-men.txt kann nicht beschrieben werden!</p>
    Wahrscheinlich sind ungenügende Zugriffsrechte gesetzt (chmod 0666).</p>";
    break;
    case "no_ip_list_file" :
    $error_msg .= "<p>Die Datei ".PFAD."counter_files/ip_list-men.txt existiert nicht!</p>";
    break;
    case "ip_list_unwriteable" :
    $error_msg .= "<p>Die Datei ".PFAD."counter_files/ip_list-men.txt kann nicht beschrieben werden!
    Wahrscheinlich sind ungenügende Zugriffsrechte gesetzt (chmod 0666).</p>";
    break;
    }
  echo $error_msg;
  exit;
}
?>
<p align="center"><?php echo $ausgabe['count']; ?><br />
<font size="1"> Besucher seit dem <strong>01.06.2007</strong></font></p>

Reiterhof Mensing | Carsten Mensing
Bockeroder Weg 2 | 31832 Springe OT. Mittelrode
TEL.: 0 50 44 / 82 50 | FAX.: 0 50 44 / 88 17 89
Für E-Mail hier klicken