Counter mit Reloadsperre

in PHP · Autor: Sebastian Fuchs

Ein Counter wird fast auf jeder Seite verwendet. Damit Besucher aber nicht mehrfach gezählt werden, kann eine Reloadsperre eingebaut werden. So ist die Besucheranzeige wesentlich authentischer.
Um dieses Tutorial zu verstehen, solltest du einige Grundkenntnisse in PHP und MySQL haben.
Zunächst überlegen wir uns, wie der Zähler funktionieren soll. Wir haben insgesamt zwei MySQL Tabellen.
In der einen wird die Zahl der Besucher, in der anderen die IPs mit der jeweiligen Besuchszeit gespeichert. Die IP eignet sich gut für die Reloadsperre, da sie sich erst nach einiger Zeit wieder ändert.
Als neue Erweiterung der Reloadsperre wurde jetzt auch noch eine Sperre über Cookies eingebaut. So ist die Sperre noch zuverlässiger.
Wenn jetzt ein Besucher unsere Seite betritt, wird geprüft, ob er schonmal innerhalb der Reloadzeit diese Seite betreten hat. Dazu werden die IPs mit der dazugehörigen Besuchszeit abgerufen und geprüft, ob der Cookie für die Reloadsperre vorhanden ist.
Stimmt eine der IPs mit der des Besuchers überein, wird der Besucher nicht gezählt.
Wenn das jedoch nicht der Fall ist, wird zuerst die Anzahl der Besucher um den Wert 1 erhöht und dann in der MySQL Tabelle abgespeichert. Danach wird noch die IP mit der aktuellen Zeit in der anderen Tabelle abgespeichert und ein neuer Cookie erstellt, damit der Besucher bei einem erneuten Besuch nicht mehr mitgezählt wird.
Nach der Theorie gehen wir jetzt in den praktischen Teil über. Als erstes werden die zwei benötigten Datenbanken erstellt. Dazu wird folgender Code über phpMyAdmin in der Datenbank ausgeführt.
CREATE TABLE `counter_stats` (
  `besucher` INT(9) NULL DEFAULT 0
);

CREATE TABLE `counter_ips` (
  `zeit` INT(11) NOT NULL,
  `ip` VARCHAR(40) NOT NULL
);
Jetzt haben wir alle benötigten MySQL Tabellen fertig und können zu der ".php"-Datei kommen. Damit wir mit der MySQL Datenbank arbeiten können, muss erst die Verbindung zu ihr hergestellt werden.
Deshalb kommt an den Anfang dieser Code:
<?php

# MySQL Zugangsdaten
mysql_connect('localhost', 'Benutzername', 'Passwort');
mysql_select_db('Datenbank');
Hier müssen die Zugangsdaten deiner MySQL Datenbank angegeben werden. Danach geht es weiter mit der Festlegung der Variablen.
# Variablen zuweisen
$zeit       = time();
$ip         = $_SERVER['REMOTE_ADDR'];

# IP Sperren abrufen
$gesperrte_ips = mysql_query('SELECT ip FROM counter_ips WHERE ip="'.$ip.'"');
Mithilfe von time() wird die aktuelle Zeit abgerufen und der Variable [/scode]$zeit[/scode] zugewiesen (die Zeit ist in Sekunden, was später noch wichtig wird). Danach wird durch $_SERVER['REMOTE_ADDR'] die aktuelle IP des Besuchers abgerufen und der Variable $ip zugewiesen.
Anschließend werden alle Werte aus der Tabelle counter_ips ausgelesen, wo die derzeitige IP des Benutzers gleich einer IP aus Datenbank ist.
Jetzt haben wir erstmal alle Werte, die wir für die weitere Verarbeitung benötigen.
Deshalb wird jetzt mit dem eigentlichen Counter begonnen.
# Counterstand erhöhen
if((mysql_num_rows($gesperrte_ips) == 0) && !isset($_COOKIE['counter_reloadsperre']))
{
  mysql_query('INSERT INTO counter_ips (zeit, ip)
                                VALUES ('.$zeit.', "'.$ip.'")');
  mysql_query('UPDATE counter_stats SET besucher=besucher+1');
  setcookie('counter_reloadsperre', $ip, time()+$reloadzeit);
}

# Counterstand abrufen
$counterstand = mysql_query('SELECT besucher FROM counter_stats');
$stand        = mysql_fetch_array($counterstand);
$counter      = $stand['besucher'];

?>
Mithilfe der if-Abfrage wird überprüft, ob die IP des aktuellen Besuchers nicht in der Datenbank vorhanden ist und noch kein Cookie erstellt wurde. Den Cookie kann man mit einem einfachen !isset() auf seine Existenz überprüfen; bei der IP wird überprüft, ob der MySQL Query erfolglos war, denn dann wurde keine Zeile mit der IP des aktuellen Besuchers gefunden.
Sind beide Bedingungen erfüllt, wird der Besucher gezählt. Dazu wird zunächst die aktuelle IP und die Besuchszeit in die IP-Datenbank eingetragen und danach der Counterstand um den Wert 1 erhöht.

Danach wird noch ein Cookie erstellt, der eine "Lebensdauer" von der Reloadzeit bekommt. Deshalb muss der Counterquelltext später ganz am Anfang des jeweiligen Dokuments eingefügt werden.
Schließlich wird dann der aktuelle Stand unseres Counters abgerufen. Da er der Variable $counter zugewiesen wurde, kann er an einer beliebigen Stelle des Dokuments wieder ausgegeben werden.
Jetzt fehlt nur noch die Reloadsperre für den Counter. Dazu fügen wir noch diese Werte ein.
$reloadzeit = 86400;
$loeschen   = $zeit-$reloadzeit;
Diese beiden Zeilen müssen unter der Zeile in der $zeit zugewiesen wird eingefügt werden. Als $reloadzeit kannst du jetzt eine beliebige Zeit in Sekunden angeben (im Beispiel wäre das ein Tag). Danach wird eine Variable $loeschen definiert. Dazu wird die Reloadzeit von der aktuellen Zeit (die ja auch in Sekunden ist) abgezogen.
Danach arbeiten wir mit diesem Wert mithilfe des folgenden Codes.
# abgelaufene IP Sperren entfernen
mysql_query('DELETE FROM counter_ips WHERE zeit<'.$loeschen);
Füge diesen Code unter der Zeile ein, wo die Variable $ip zugewiesen wird.
Dieser Query bewirkt, dass alle IPs aus der Datenbank gelöscht werden, deren Reloadsperre abgelaufen ist (dort ist die Reloadzeit kleiner als die aktuelle Löschzeit).
Es ist wichtig, dass dieser Code vor dem if steht, da abgelaufene IP Sperren gelöscht werden sollen, bevor mit dem Zählen von neuen Besuchern begonnen wird.
Hiermit haben wir schon unseren fertigen Counter. Den ganzen Code am Stück kannst du dir unter Downloads herunterladen.

Downloads:



· zurück zu "PHP Tutorials"

Lesezeichen

Diese Seite zu Mister Wong hinzufügen Diese Seite zu del.icio.us hinzufügen Diese Seite bei YiGG hinzufügen Diese Seite bei LinkARENA hinzufügen Diese Seite zu alltagz hinzufügen Diese Seite bei iGoogle hinzufügen