[PHP & MySQL] Counter mit IP-Sperre

An dieser Stelle möchte ich erklären, wie man einen Counter mit IP-Sperre basteln kann. Zudem habt ihr die Möglichkeit, den Counterstand als Grafik ausgeben zu können.

Als erstes benötigen wir eine Datenbank mit zwei Tabellen:
counter_hits zum Zählen der Besucher und counter_ips zum Überwachen der IP-Adressen.
Die counter_hits bekommt die Zelle hits als zehnstelligen Integer, der auch null sein darf.
Die counter_ips bekommt die Zellen zeit und ip, wobei zeit ebenfalls ein zehnstelliger Integer und ip ein 15-stelliger Text unterschiedlicher Zeichen ist. Beide können null sein.
Es ergibt sich der folgende Code zum Erstellen der Tabellen:

SQL:
 1 
 2 
CREATE TABLE counter_hits (`hits` INT( 10 ) NULL);
CREATE TABLE counter_ips (`zeit` INT( 10 ) NULL, `ip` VARCHAR( 15 ) NULL);

Damit ist die Grundlage für den Counter bereits geschaffen.
Kommen wir also zum eigentlichen Script:
counter.php:
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
<?php
    define
('MYSQL_HOST''localhost');      // Datenbank-Host (meist localhost)
    
define('MYSQL_USER''username');       // Benutzer der Datenbank
    
define('MYSQL_PASS''passwort');       // Passwort fuer die Datenbank
    
define('MYSQL_DATABASE''datenbank');  // Name der benutzten Datenbank
    
    
if (@mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS)) {
        
mysql_select_db(MYSQL_DATABASE);
        
        
$sql  mysql_query("SELECT `zeit`, `ip` FROM `counter_ips` WHERE `ip`='$REMOTE_ADDR'");
        
$zeit time();
        if(
mysql_num_rows($sql)<1) {
            
mysql_query("UPDATE `counter_hits` SET `hits`=`hits`+1");
            
mysql_query("INSERT INTO `counter_ips` (zeit, ip) VALUES ('$zeit', '$REMOTE_ADDR')");
        }
        
$del  $zeit 86400;
        
mysql_query("DELETE FROM `counter_ips` WHERE `zeit` < $del") or die(mysql_error());
        
        
$sql  mysql_query("SELECT `hits` FROM `counter_hits`") or die(mysql_error());
        
$row  mysql_fetch_array($sql);
        
        
$aufruf $row["hits"];
        
        echo 
$aufruf;
        
        
mysql_close();
    } else {
        echo 
"Critical Error!<br />\n";
        echo 
"Could not connect to database!\n";
    }
?>

Wir stellen also zunächst einmal die Verbindung zur Datenbank her. Sollte dies schiefgehen, wird eine Fehlermeldung ausgegeben. Diese ist wesentlich kürzer als die standardmäßige Fehlermeldung von PHP und mySQL.
Nachdem dies erledigt ist, suchen wir die IP des aktuellen Benutzers in der counter_ips anhand seiner IP. Schließlich wollen wir nur neue Besucher zählen.
Finden wir keinen Eintrag mit der Benutzer-IP, erhöhen wir den Counterstand um eins. Zudem speichern wir die neue IP mit der aktuellen Zeit in der counter_ips.
Anschließend löschen wir alle IPs aus der counter_ips, die länger als 24h in der Datenbank waren. Somit werden diese IPs wieder freigegeben.
Nun lesen wir den aktuellen Counterstand aus und speichern seinen Wert in der Variable $aufruf.
Zu guter letzt geben wir den Counterstand mit echo aus.
Fertig.
einfach als counter.php speichern und irgendwo in der eigenen Website einbauen. Das ist alles...

Alles?
Nein... nicht ganz. Ich habe euch noch ein Bild versprochen.
Legt also eine counter_img.php an, in der folgendes steht:
counter_img.php:
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
<?php
    $image 
ImageCreate(8015);
   
    
$col1 ImageColorAllocate($image000);       // Schriftfarbe
    
$col2 ImageColorAllocate($image255255255); // Hintergrundfarbe
    
$col3 ImageColorAllocate($image200200200); // Rahmenfarbe
   
    
ImageFilledRectangle($image008015$col3);
    
ImageFilledRectangle($image117813$col2);
   
    
ImageString ($image251$_REQUEST['counter'], $col1);
   
    
header("Content-type: image/png");
    
ImagePNG($image);
    
ImageDestroy($image);
?>

Wir erzeugen hier ein Bild der Größe 80x15 Pixel und definieren erstmal drei Farben, je eine für die Schrift, den Hintergrund und den Rahmen. Dann färben wir das Bild mit dem Rahmen und dem Hintergrund. Anschließend schreiben wir den Counterstand, den wir später noch übertragen, auf das Bild und geben es aus.
So einfach ist das.

Um das Bild nun auszugeben, ersetzen wir in der counter.php folgendes (Zeile 24):
PHP:
 1 
echo $aufruf;
durch dieses:
PHP:
 1 
echo "<img src=\"counter_img.php?counter=".$aufruf."\" width=\"80\" height=\"15\" border=\"0\" alt=\"".$aufruf."\" />\n";


Und fertig ist unser Counter mit Bildausgabe.

War doch halb so schlimm, oder? *gg*

nach oben