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.
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.
Die Anforderungen
sind einfach:
Diese Anforderungen lassen sich mit PHP und MySQL gut lösen.
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:
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:
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.
Jetzt brauchen wir in einem PHP-Skript
eine Funktion, die
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).
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:
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>
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.
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.
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.
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!
Um unsere Anforderungen zu erfüllen,
waren drei Arbeitsschritte nötig:
Wir haben als individuelle Erweiterung in der Tabelle zusätzliche Felder definiert:
Die Ausgabe des Besucherzählers in der aufrufenden HTML-Seite kann sinnvoll sein, sie ist aber nicht zwingend.
Das kleine Beispiel ist in der Praxis für die meisten Anwendungsfälle hinreichend komfortabel und völlig ausreichend. Wer möchte, der kann ...
Die Liste solcher Erweiterungen lässt sich beliebig fortsetzen. Die Basis dafür ist gelegt.
Viel Spaß mit der Umsetzung unseres Besucherzählers