PHP – Ein einfacher Besucherzähler mit IP-Sperre

Auf vielen Blogs oder Homepages sieht man diese Besucherzähler, “Du bist der 12345. Besucher auf meiner Seite!”, “Diese Seite wurde heute schon 123 mal angesehen.”, etc. Die meisten dieser Zähler zeigen an wieviele Besucher die Seite seit Anfang der Zählung besucht haben, manche zeigen an wieviele Besucher gerade jetzt die Seite ansehen, andere zeigen sogar ganze Statistiken über tägliche, wöchentliche und monatliche Besucherzahlen an. In dieser Anleitung werde ich darauf eingehen wie man einen sehr simplen Besucherzähler programmieren kann. Grundkenntnisse in PHP und dem Umgang mit MySQL Datenbanken sind von Vorteil.

Inhaltsverzeichnis

1. Funktionsweise und Voraussetzungen
2. Programmieren des Zählers
2.1. Zum MySQL-Server verbinden
2.2. Aktuellen Stand des Zählers auslesen
2.3. Liste der gesperrten IPs aussortieren
2.4. Abfragen ob der Besucher schon gezählt wurde
2.5. Zähler erhöhen und Sperrung der IP
2.6. Ausgabe des Zählerstandes
3. Abschließendes

1. Funktionsweise und Voraussetzungen

Der in diesem Tutorial beschriebene Besucherzähler ist relativ simpel. Damit ein Besucher nicht mehrmals gezählt wird, wird seine IP gespeichert und vor dem Erhöhen des Zählers wird abgefragt ob diese IP schon gezählt wurde. Der genaue Ablauf sieht so aus: Zuerst wird eine Verbindung zur MySQL-Datenbank aufgenommen. Aus dieser wird dann der aktuelle Zählerstand ausgelesen. Dann werden die gesperrten IPs deren Besuch schon länger als einen bestimmten Zeitraum(z.B. 24 Stunden) zurückliegt aus der Datenbank gelöscht. Anschließend wird abgefragt ob die IP des aktuellen Besuchers gesperrt ist. Ist sie das nicht, wird der Zählerstand um 1 erhöht und die IP auf die Sperrliste gesetzt. Anschließend wird der aktuelle Zählerstand ausgegeben.

Es ist eine MySQL-Datenbank mit folgenden 2 Tabellen nötig:

Tabelle: Daten

Spalte	      Typ
bezeichnung   varchar (80)
wert	      int

Diese Tabelle wird später nur einen einzigen Datensatz enthalten. In der ersten Spalte wird “zaehlerstand” stehen, und in der zweiten Spalte steht dann der Stand des Zählers.

Tabelle: Besucher

Spalte      Typ
ip	    varchar (15)
zeit	    datetime

Diese Tabelle speichert die gesperrten IPs, mit jeder IP wird auch der Zeitpunkt des Besuchs gespeichert. Die Spalte IP ist vom Typ ein VARCHAR mit 15 Stellen, also kann diese Spalte maximal 15 Zeichen fassen. Mehr sind auch nicht nötig, da eine IP nie mehr als 15 Zeichen hat. Die zweite Spalte speichert den Zeitpunkt.

Diese beiden Tabellen lassen sich leicht per phpMyAdmin anlegen. Andernfalls kann auch folgender PHP-Code verwendet werden. (Vorher die 4 Werte von mysql_connect und mysql_select_db anpassen!)

<?php
 
mysql_connect("Server", "Benutzername", "Passwort");
mysql_select_db("Datenbank");
 
mysql_query("CREATE TABLE `daten` (`bezeichnung` varchar (80) NOT NULL, `wert` int NOT NULL)");
mysql_query("INSERT INTO `daten` (`bezeichnung`, `wert`) VALUES ('zaehlerstand', 0)");
 
mysql_query("CREATE TABLE `besucher` (`ip` varchar (15) NOT NULL, `zeit` datetime NOT NULL)");
 
?>

Außerdem muss natürlich noch eine PHP-Datei angelegt werden, die den Code des Zählers enthält, z.B. zaehler.php.

2. Programmieren des Zählers

2.1 Zum MySQL-Server verbinden

Bevor mit der Datenbank gearbeitet werden kann, muss zuerst eine Verbindung mit der Datenbank aufgebaut werden. Hierzu werden mysql_connect und mysql_select_db verwendet.

/* Zum MySQL-Server verbinden */
mysql_connect("Serveradresse", "Benutzername", "Passwort");
mysql_select_db("Name der Datenbank");

mysql_connect öffnet mit den angegebenen Daten eine Verbindung zum MySQL-Server. Mit mysql_select_db wird die Datenbank festgelegt, an die später die Abfragen gerichtet werden.

2.2 Aktuellen Stand des Zählers auslesen

/* Aktuellen Stand des Zaehlers auslesen */
$abfrage  = mysql_query("SELECT `wert` FROM `daten` WHERE `bezeichnung` = 'zaehlerstand'");
$ergebnis = mysql_fetch_assoc($abfrage);
 
$besucherGesamt = $ergebnis['wert'];

mysql_query schickt den in Anführungsstrichen angegebenen SQL-Befehl an die Datenbank. Das Ergebnis dieses Befehls wird in $abfrage gespeichert.
“SELECT `wert` FROM `daten` WHERE `bezeichnung` = ‘zaehlerstand’” fragt den Wert in der Spalte wert von der Tabelle daten ab, wo die Bedingung das in der Spalte bezeichnung zaehlerstand steht, zutrifft. Wenn man jetzt mysql_fetch_assoc mit $abfrage als Parameter aufruft, wird ein Datensatz aus dem Ergebnis ausgelesen und in einem Array gespeichert. mysql_fetch_assoc muss hier nur einmal aufgerufen werden, da nur ein Datensatz erwartet wird(zaehlerstand). Der Vorteil von mysql_fetch_assoc gegenüber mysql_fetch_row ist, das der Name der abgefragten Spalte(n) als Bezeichner im Array verwendet werden. Also $ergebnis['wert'] und nicht $ergebnis[0]. Das macht den Code übersichtlicher.

2.3 Liste der gesperrten IPs aussortieren

/* Gesperrte IPs loeschen, wenn der Besuch laenger als 1 Tag zurueck liegt. */
mysql_query("DELETE FROM `besucher` WHERE `zeit` < (NOW() - INTERVAL 1 DAY)");

IPs deren Besuch schon länger als einen Tag zurückliegt, werden aus der Datenbank gelöscht. Auch das wird mit mysql_query und einem SQL-Befehl gemacht. “DELETE FROM `user` WHERE `zeit` < (NOW() – INTERVAL 1 DAY)” löscht alle Datensätze aus der Tabelle besucher, bei denen in der Spalte zeit ein Wert steht, der kleiner als der aktuelle Zeitpunkt minus 1 Tag ist. Wenn also jetzt der 10/10/07 10:20 wäre, würde ein Datensatz mit dem Zeitpunkt 09/10/07 10:19 gelöscht werden, einer mit 09/10/07 10:21 nicht.

2.4 Abfragen ob der Besucher schon gezählt wurde

/* Besucher schon gezaehlt? */
$besucherIp = $_SERVER['REMOTE_ADDR'];
 
$abfrage    = mysql_query("SELECT COUNT(*) FROM `besucher` WHERE `ip` = '$besucherIp'");
$ergebnis   = mysql_fetch_assoc($abfrage);
 
$besucherSG = $ergebnis['COUNT(*)'];

Um das zu überprüfen wird zuerst einmal die IP des Besuchers benötigt. Diese ist in $_SERVER['REMOTE_ADDR'] gespeichert. $_SERVER ist eine superglobale Variable, d.h. sie ist überall im PHP-Skript verfügbar. Anschließend wird wieder ein SQL-Befehl an die Datenbank geschickt, “SELECT COUNT(*) FROM `besucher` WHERE `ip` = ‘$besucherIp’” zählt die Datensätze in der Tabelle besucher bei denen in der Spalte ip der Inhalt der Variable $besucherIp (die IP des Besuchers) steht. Jetzt wird wieder per mysql_fetch_assoc ein Datensatz aus dem Ergebnis ausgelesen. Wieviele Datensätze mit der IP des Besuchers gefunden wurden wird dann in $besucherSG gespeichert.

2.5 Zähler erhöhen und Sperrung der IP

Falls der Besucher noch nicht gezählt(und somit gesperrt) wurde, muss der Zähler erhöht und der Besucher gesperrt werden.

/* Falls nicht, Zaehler um 1 erhoehen und IP sperren. */
if (!$besucherSG) {
$besucherGesamt++;
mysql_query("INSERT INTO `besucher` (`ip`, `zeit`) VALUES ('$besucherIp', NOW())");
mysql_query("UPDATE `daten` SET `wert` = $besucherGesamt WHERE `bezeichnung` = 'zaehlerstand'");
}

Das Ausrufezeichen in der if-Bedingung bedeutet das die Bedingung nur erfüllt ist wenn das nach dem Ausrufezeichen FALSE (unwahr) ist. TRUE und FALSE lassen sich auch in Zahlen umrechnen, nämlich: FALSE = 0, TRUE = alles >0. Ist $besucherSG also 0(FALSE) ist die Bedingung erfüllt, wegen dem Ausrufezeichen. Ist $besucherSG = 1 (TRUE) ist sie nicht erfüllt.
Wenn der Besucher noch nicht gezählt wurde wird jetzt $besucherGesamt inkrementiert(um 1 erhöht). “INSERT INTO `besucher` (`ip`, `zeit`) VALUES (‘$besucherIp’, NOW())” erstellt in der Tabelle besucher einen neuen Datensatz und schreibt in die Spalten ip und zeit die Werte $besucherIp und NOW() (das aktuelle Datum + Zeit). “UPDATE `daten` SET `wert` = $besucherGesamt WHERE `bezeichnung` = ‘zaehlerstand’” aktualisiert in der Tabelle daten den Inhalt der Spalte wert zu $besucherGesamt wenn in der Spalte bezeichnung die Zeichenkette zaehlerstand steht.

2.6 Ausgabe des Zählerstandes

Jetzt muss der Zählerstand nur noch ausgegeben werden. Dazu genügt folgender Code:

echo "Besucher insgesamt: $besucherGesamt";

Sollte selbsterklärend sein.

3.0 Abschließendes

Der Besucherzähler kann jetzt per include(“zaehler.php”); in eine Webseite integriert werden. Es ist natürlich nur ein sehr simpler Besucherzähler, man kann ihn aber beliebig erweitern.
Hier nochmal der gesamte PHP-Code:

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
32
33
34
35
<?php
 
/* Zum MySQL-Server verbinden */
mysql_connect("", "", "");
mysql_select_db("");
 
/* Aktuellen Stand des Zaehlers auslesen */
$abfrage  = mysql_query("SELECT `wert` FROM `daten` WHERE `bezeichnung` = 'zaehlerstand'");
$ergebnis = mysql_fetch_assoc($abfrage);
 
$besucherGesamt = $ergebnis['wert'];
 
/* Gesperrte IPs loeschen, wenn der Besuch laenger als 1 Tag zurueck liegt. */
mysql_query("DELETE FROM `besucher` WHERE `zeit` < (NOW() - INTERVAL 1 DAY)");
 
/* Ist die IP gesperrt? */
$besucherIp = $_SERVER['REMOTE_ADDR'];
 
$abfrage    = mysql_query("SELECT COUNT(*) FROM `besucher` WHERE `ip` = '$besucherIp'");
$ergebnis   = mysql_fetch_assoc($abfrage);
 
$besucherSG = $ergebnis['COUNT(*)'];
 
/* Falls nicht, Zaehler um 1 erhoehen und IP sperren. */
if (!$besucherSG) {
$besucherGesamt++;
mysql_query("INSERT INTO `besucher` (`ip`, `zeit`) VALUES ('$besucherIp', NOW())");
mysql_query("UPDATE `daten` SET `wert` = $besucherGesamt WHERE `bezeichnung` = 'zaehlerstand'");
}
 
/* Ausgabe */
echo "Besucher insgesamt: $besucherGesamt
";
 
?>

Der Code darf auch gerne so übernommen werden.

Informationen

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (2 Bewertungen, Durchschnitt: 5,00 von 5)
Loading ... Loading ...
Schlagwörter: , ,
Kategorie: Anleitungen, PHP
Ansichten: 4.978

Kommentare

Bisher wurden 3 Kommentare geschrieben.

  • PHP-Newbie sagt:

    Danke für diese gute Anleitung. Sie ist sehr gut gegliedert und ebenso gut erklärt, sodass sich ich auch PHP-Neulinge (wie z.B. ich ^^) gut zrecht finden.
    Nur gab es bei mir in der Zeile 14 einen Fehler. Die Umschreibung < wurde bei mir nicht als “<” interpretiert. Liegt es daran, dass diese Umschreibung im SQL-Befehl nicht zulässig ist, oder hat das einen anderen Grund?
    Grüße PHP-Newbie

  • Antu sagt:

    Der Fehler lag bei mir bzw. bei WordPress (Blog-Software), eigentlich stand dort ein < , das wurde aber automatisch zu &lt; umgewandelt. Das muss ich wohl übersehen haben als ich die Anleitung hier geschrieben hab. Jetzt sollte alles stimmen. :)

  • Frankie sagt:

    Hier das Ganze in fertig:

    http://www.debilsoft.de

    Läuft gut bei mir.

    Grüße

    Frankie

Kommentar schreiben

XHTML: Folgende Elemente sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Angetrieben durch Wordpress Thema erstellt von Antu