ok, auf deine gefahr^^:
<?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", 5);
# 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.txt")) {
error("no_counter_file");
} else {
$ip_listing = file(PFAD."counter_files/ip_list.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.txt")) {
error("no_ip_list_file");
} elseif (!is_writable(PFAD."counter_files/ip_list.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.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.txt")) {
error("no_counter_file");
} elseif (!is_writable(PFAD."counter_files/count.txt")) {
error("count_unwriteable");
} else {
$counts = file(PFAD."counter_files/count.txt");
$count = trim($counts[0]);
$count++;
$fh = fopen(PFAD."counter_files/count.txt","wb");
flock($fh, LOCK_EX);
fwrite($fh, $count);
fclose($fh);
}
return;
}
function show_counter() {
global $ip;
if (!file_exists(PFAD."counter_files/count.txt")) {
error("no_counter_file");
}
$counterlines = file(PFAD."counter_files/count.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.txt existiert nicht!</p>";
break;
case "count_unwriteable" :
$error_msg .= "<p>Die Datei ".PFAD."counter_files/count.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.txt existiert nicht!</p>";
break;
case "ip_list_unwriteable" :
$error_msg .= "<p>Die Datei ".PFAD."counter_files/ip_list.txt kann nicht beschrieben werden!
Wahrscheinlich sind ungenügende Zugriffsrechte gesetzt (chmod 0666).</p>";
break;
}
echo $error_msg;
exit;
}
?>
irritierend find ich eben grad auf der funpicseite diese komischen zeichen, die hatte ich nochnie :P
ups, link zur funpicseite: molchilein/mo.funpic.de/counter