Besucherzähler in PHP/MySQL

Besucherstatistik | © Geschütztes Bildmaterial | Copyrighted Picture

Besucherzähler in PHP/MySQL

Besucherzähler sind dafür da, festzuhalten, wie oft bestimmte Seiten von Besuchern aufgerufen werden. Die üblichen Lösungen beschränken sich in der Regel auf die Startseite einer Website und sind deshalb ohne großen Aufwand leicht zu realisieren. Sie sind aber meist auch nicht besonders aussagekräftig.

Die Herausforderung

In komplexen Websites mit vielen Unterseiten und verschiedenen Themen ist es spannend, zu erfahren, welche Seiten besonders oft und welche gar nicht besucht werden. Diese Informationen können ausgewertet werden, um das Angebot der Website zu überprüfen und an den Bedarf der Besucher anzupassen.

Die Analyse-Tools von Web-Hostern sind dafür oft ungeeignet. Sie liefern die Zugriffe auf alle Dateien in der Struktur, nicht nur auf die eigentlichen HTML-Webseiten. Das ergibt einen Wust an Informationen, der nur schwer durchschaubar ist. Wie oft aber eine Datei namens layout.gif aufgerufen wurde, die nur der grafischen Gestaltung einer Seite dient, ist völlig uninteressant.

Mit einem eigenen Besucherzähler kann genau festgelegt werden, für welche Seiten statistische Informationen gesammelt werden sollen.

Für jede Seite einen Besucherzähler einrichten – das kann aufwändig sein! Oder doch nicht? Wir suchen einen komfortablen Weg, der möglichst vollautomatisch arbeitet und nur wenig Programmieraufwand erfordert.

Anforderungen an einen komfortablen Besucherzähler

Die Anforderungen
sind einfach:

  • Jede Seite, die wir dafür bestimmen, soll einen eigenen Besucherzähler bekommen.
  • Die Informationen sollen übersichtlich in einer Liste zusammengefasst sein.
  • Werden Seiten geändert oder kommen neue hinzu, soll dadurch keinerlei administrativer Aufwand entstehen - wir möchten ein vollautomatisches System.

Diese Anforderungen lassen sich mit PHP und MySQL gut lösen.

Die Datenbank

Zunächst brauchen wir eine Tabelle in einer MySQL-Datenbank. In dieser Tabelle genügen zwei Felder, wir verwenden zwei zusätzliche Felder, um weitere Informationen zu speichern:

  • 1. Feld: number, optionales Feld, das eine laufende Nummer aufnimmt. Sie dient nur der späteren Übersichtlichkeit und einer einfacheren Handhabung der Datensätze in der Tabelle, z. B. für Sortiervorgänge.
  • 2. Feld: access_page, der Seitenname. Hier wird der Titel der Web-Seite gespeichert, wie er im Head-Meta-Tag <title> </title> in der HTML-Seite verwendet wird. Später müssen wir darauf achten, dass jede Seite einen eigenen, eindeutigen Titel erhält. Sonst wird die gespeicherte Information verwässert.
  • 3. Feld: access_counter, der eigentliche Besucherzähler. Dieser numerische Wert wird ganz einfach bei jedem Zugriff auf die Seite um 1 erhöht.
  • 4. Feld: access_date, optionales Feld, ein Zeitstempel. Sobald der Zugriff auf die Seite stattfindet und der Zähler um 1 erhöht wird, speichert die Datenbank hier automatisch den aktuellen Zeitstempel ab. Diese Information dient späteren Analysen.

Die beiden entscheidenden Felder sind die Felder 2 ( access_page) und 3 (access_counter). Weitere Felder können selbstverständlich hinzugefügt werden.

 

Die Definition für die Datenbank sieht nun so aus:

  • Das Feld 1 (number) ist vom Typ INTEGER, Unique und mit Autoinkrement.
    Sobald ein neuer Datensatz angelegt wird, sucht die Datenbank den bisher höchsten Wert von number in der Tabelle. Sie erhöht ihn um 1 und speichert ihn in diesem Feld. Die Datensätze bekommen eine fortlaufende Nummerierung.
  • Das Feld 2 (access_page) ist vom Typ VARCHAR oder Text und es ist der PRIMARY KEY. Als Kollation empfiehlt sich utf8_bin, damit auch Umlaute korrekt gespeichert und ausgegeben werden.
  • Das Feld 3 ( access_counter) ist vom Typ INTEGER.
  • Das Feld 4 (access_date) ist vom Typ TIMESTAMP, das Attribut ist CURRENT_TIMESTAMP, und das Feld ist mit der Regel on update CURRENT_TIMESTAMP angelegt. Dadurch wird das Änderungsdatum automatisch von der Datenbank selbst eingetragen. Wir müssen nichts mehr programmieren.

Damit Umlaute korrekt behandelt werden, sollte die Tabelle mit der Kollation utf8_bin angelegt werden.

Die PHP-Funktion

Jetzt brauchen wir in einem PHP-Skript
eine Funktion, die

  • auf die Datenbank verlinkt und sie öffnet
  • in der Tabelle prüft, ob ein bestimmter Datensatz schon existiert und dann entweder einen neuen Datensatz mit dem Zugriffswert 1 anlegt, oder im bestehenden Datensatz den Zugriffszähler um 1 erhöht
  • den aktuellen Wert des Zugriffszählers zurückgibt

Das geht recht einfach. Nennen wir die Datei besucherzaehler.php und die Funktion besucher():

 
<?php // besucherzaehler.php // ------------------- // by Reiner Makohl // www.stilkunst.de // function besucher {  // 1. Initialisierung  // Hier müssen unbedingt die richtigen Daten  // eingetragen werden  $db_host_name = "localhost"; // Server  $db_user_name = "root"; // Datenbank-Owner  $db_pass_name = ""; // Passwort des Owners  $db_name_name = "meine-datenbank"; // Name der Datenbank  $db_table = "zugriff"; // Name der Tabelle  $counter_page = "access_page"; // Name von Feld 2: Seite  $counter_field = "access_counter"; // Name von Feld 3: Zugriffszähler  $error_message = "Es ist ein Fehler aufgetreten."; // Beliebig anpassbar  // --- Ab hier braucht nichts mehr angepasst werden! --- //  // 2. Defines machen Code übersichtlich ...  define ("DB_HOST", $db_host_name); // Setze Datenbank-Host  define ("DB_USER", $db_user_name); // Setze Datenbank-User  define ("DB_PASS", $db_pass_name); // Setze Datenbank-Passwort  define ("DB_NAME",$db_name_name); // Setze Datenbank-Name  define ("DB_TABLE", $db_table); // Setze Datenbank-Tabelle  define ("COUNTER_FIELD", $counter_field); // Setze Feld Zähler  define ("COUNTER_PAGE", $counter_page); // Setze Feld Seitenname  // 3. Datenbank öffnen  $link = mysql_connect(DB_HOST, DB_USER, DB_PASS)  or die($error_message." #1");  $db = mysql_select_db(DB_NAME, $link) or die($error_message." #2");  // 4. UTF-8-Kodierung erzwingen  // damit Umlaute korrekt an die Datenbank übertragen werden  mysql_query('SET NAMES "utf8"');  // 5. Datensatz einfügen    // Wenn er schon existiert: Zugriffszähler erhöhen  $sql_call = "INSERT INTO ".DB_TABLE." (".COUNTER_PAGE.", "  .COUNTER_FIELD.") VALUES ('".$record."', 1)  ON DUPLICATE KEY UPDATE ".COUNTER_FIELD." = ".COUNTER_FIELD." + 1";  mysql_query($sql_call) or die($error_message." #3");  // 6. Aktuellen Zugriffszähler abfragen und zurückgeben  $sql_call = "SELECT ".COUNTER_FIELD." FROM ".DB_TABLE."  WHERE ".COUNTER_PAGE." = '".$record."'";

 $sql_result = mysql_query($sql_call) or die($error_message." #4");  $row = mysql_fetch_assoc($sql_result);
 $x = $row[COUNTER_FIELD];  // 7. Datenbank schließen  mysql_close($link);  // 8. Aktuellen Zugriffszähler zurückgeben  return $x; } ?>

 

Die gesamte Funktion könnte auch deutlich kürzer geschrieben werden. Der lange Initialisierungsblock ist aber sinnvoll. Wir brauchen die individuellen, konkreten Namen und Werte nur einmal angeben und finden alle Variablen an einem Ort. Das schafft Übersicht und die SQL-Aufrufe im eigentlichen Funktionsteil müssen nicht mehr überarbeitet und angepasst werden.

Für PHP-Programmierer sei angemerkt: Der entscheidende Kniff in dieser Funktion ist das MySQL-Statement INSERT INTO table ... ON DUBLICATE KEY UPDATE ... mit der integrierten Erhöhung eines Feldwertes in content_of_field = content_of_field + 1 (hier: COUNTER_FIELD).

Einbindung in die HTML-Datei

Die HTML-Dateien, die diese Funktion nutzen wollen, müssen nun die Endung .php tragen, beispielsweise statt index.html muss eine Seite nun index.php heißen. Wir benennen sie einfach um. Darüber hinaus sind nur zwei bis drei kleine Ergänzungen und Änderungen in den HTML-Dateien nötig:

 

1. Festlegung des Seitentitels

Ganz am Anfang der HTML-Seite
definieren wir:

 

 
<?php
 $page_name = "Ein frei wählbarer Seitenname";
?>
 

 

Hier bekommt die PHP-Variable $page_name einen beliebigen Inhalt zugewiesen. Überlegen Sie sich, wie die Seite heißen soll. Den Inhalt dieser Variablen verwenden wir an zwei Stellen weiter unten in der selben HTML-Seite.

Zunächst - das ist nicht zwingend, aber so naheliegend! - tragen wir den Seitennamen im HTML-Head-Meta-Tag <title> ein:


<title><?php echo $page_name; ?></title>
 

Bevor die Seite an den Browser des Benutzers übermittelt wird, wird beim Aufruf die PHP-Funktion echo ausgeführt: Der Inhalt der Variablen $page_name wird an dieser Stelle ausgegeben. Effektiv steht da nun – und so bekommt es der Browser des Benutzers zugeschickt! – in diesem Beispiel:


<title>Ein frei wählbarer Seitenname</title>
 
Noch ein Hinweis zum Seitentitel:

Der Text zwischen den Meta-Tags <title> und </title> wird von Browsern in der Titelzeile des Fensters oder in den Tabs der Tab-Leiste angezeigt. Suchmaschinen werten den Ausdruck aus und zeigen ihn in den Suchergebnissen an. Unsere Funktion verwendet den Titel als Schlüsselwert in einer Datenbank. Der Titel einer HTML/PHP-Seite ist demnach ein wesentliches Merkmal der Seite.

Überlegen Sie daher gut, wie eine Seite heißen soll. Nutzen Sie aussagekräftige Wörter und Begriffe. Wenn Sie den Titel einer Seite später ändern wollen, wird das Auswirkungen haben. In Fall des Besucherzählers heißt das: er beginnt wieder bei »1«! Zwar ist der alte Wert dann nicht verloren (ein Vorteil von Datenbanken!), aber er müsste in der Datenbank händisch ermittelt und auf den neuen Wert aufaddiert werden, wenn Ihnen die Gesamtmenge aller Aufrufe einer Seite wichtig ist.

 

2. Der Funktionsaufruf

An geeigneter Stelle binden wir das Skript besucherzaehler.php in unsere HTML-Datei mit dem PHP-Befehl include ein und übergeben an die Funktion besucher() den Inhalt der Variablen $page_name:

 

 
<?php
 include "besucherzaehler.php"; $anzahl_zugriffe = besucher($page_name);
?>
 

 

Diese beiden PHP-Zeilen können auch gerne mit der obigen Variablenzuweisung von $page_name kombiniert werden. Das hat den Vorteil, dass für Kopiervorgänge nur ein Block angefasst werden muss. Wichtig ist nur: Die Variable $page_name muss ihren Inhalt bekommen, bevor die Funktion besucher($page_name)aufgerufen wird.

 

Wie arbeitet nun die Funktion?

Handelt es sich bei dieser HTML-Seite um eine neue Seite oder ist der Seitentitel in der Variablen $page_name geändert worden, – ist also der Inhalt von $page_name in der Tabelle bisher nicht vorhanden! –, dann wird die aufgerufene Funktion besucher() einen neuen Datensatz in der Datenbanktabelle anlegen. Dabei wird als Primärschlüssel den Seitenname verwendet. Die Funktion wird den Wert 1 zurückgeben – der erste Aufruf hat stattgefunden.

Ist bereits ein Datensatz mit dem selben Seitentitel als Schlüsselwert vorhanden, wird die Funktion den Zähler in diesem Datensatz um 1 erhöhen, den Zeitstempel aktualisieren und den aktuellen Wert des Zählers in der Variablen $anzahl_zugriffe zurückgeben.

 

3. Den Zählerwert ausgeben

Die Funktion besucher($page_name) hat die Variable $anzahl_zugriffe mit dem aktuellen Stand des Zählers versorgt. Es kann Sinn machen, den Zählerwert auf der selben Seite auszugeben und sichtbar zu machen. Das geht recht einfach, hängt aber vom Webdesign ab. Fügen Sie an einer Stelle im HTML-Code eine sinnvolle Ausgabe ein, z. B. so:

 

 
<div class="footer"> <p><?php echo "Sie sind der ", $anzahl_zugriffe, "
  . Besucher auf dieser Seite. Herzlich willkommen!"
; ?></p> </div>
 

Das obige Beispiel geht davon aus, dass im HTML-Code ein DIV-Bereich angelegt wird, der in der CSS-Klasse .footer näher beschrieben ist. In diesem DIV-Bereich wird ein Textabsatz erzeugt (<p></p>). Der Text selbst entsteht durch die Ausgabe des PHP-echo-Befehls.

Damit sind wir auch schon fertig!

Zusammenfassung

Um unsere Anforderungen zu erfüllen,
waren drei Arbeitsschritte nötig:

  • In einer MySQL-Datenbank ist eine Tabelle anzulegen mit mindestens den beiden Feldern für den Seitennamen als Primärschlüssel und dem Zählerwert.
  • Es ist eine Funktion in PHP zu schreiben, die vollautomatisch die Seiten erfasst und die Zugriffe zählt.
  • Die aufrufenden HTML-Seiten müssen nun PHP-Seiten werden (Endung .php), bekommen einen eindeutigen Seitentitel als Wert für den Primärschlüssel in der Datenbank und rufen die Funktion für die Zählung auf.

Wir haben als individuelle Erweiterung in der Tabelle zusätzliche Felder definiert:

  • Das Feld "Fortlaufende Nummer" in der Tabelle. Es hilft die Übersicht zu wahren.
  • Das Feld "Zeitstempel" in der Tabelle. Es hilft dabei, festzustellen, welche Seiten seit längerer Zeit nicht mehr besucht wurden.

Die Ausgabe des Besucherzählers in der aufrufenden HTML-Seite kann sinnvoll sein, sie ist aber nicht zwingend.

Weiterführende Programmieraufgaben

Das kleine Beispiel ist in der Praxis für die meisten Anwendungsfälle hinreichend komfortabel und völlig ausreichend. Wer möchte, der kann ...

  • sich nun für die Datenbanktabelle ein kleines Analyse-Tool schreiben, das die Tabelle auswertet und die Seiten mit den höchsten bzw. niedrigsten, den jüngsten oder den ältesten Zugriffswerten ausgibt. Die Liste kann sortiert ausgegeben werden nach Zugriffsdatum, nach Seitennamen, nach fortlaufender Nummer in der Datenbank.
  • neben dem Seitennamen auch den Pfadnamen der HTML-Datei innerhalb der Website in einem weiteren Tabellenfeld speichern, was das Auffinden der Seiten in einem Datei-Browser erleichtert;
  • eine weitere Tabelle daneben stellen, die als Primärschlüssel die IP-Adresse des Benutzers verwendet und nun zählt, wie oft die Seite von bestimmten IP-Adressen aufgerufen wurde. Dadurch lässt sich feststellen, ob die vielen Besucher vielleicht doch nur Suchmaschinen und Roboter, und in Wahrheit gar keine interessierten Mitmenschen waren.

Die Liste solcher Erweiterungen lässt sich beliebig fortsetzen. Die Basis dafür ist gelegt.

Viel Spaß mit der Umsetzung unseres Besucherzählers

Sabrina

Text | Grafik | Webdesign | Layout:

©by Reiner Makohl | Stilkunst.de
©by Sabrina | SABRINA CREATIVE DESIGN™