Page Hit Counter mit allen Schikanen
von Hannes am 02.06.2011 in My Modx mit 0 Kommentaren
Tweet
Für Evolution gut bekannt, für Modx Revolution schmerzlich vermisst: Ein sogenannter "Page Hit Counter" zählt Besucher bzw. Aufrufe einer Seite. Bisher gab es solch ein Snippet nicht für Modx Revolution, jetzt schon.
Ein paar Vorüberlegungen
Geht es um einen Besucherzähler, so sollte man unterscheiden zwischen reinen Aufrufen und Besuchern. Der Unterschied liegt darin, dass ein Besucher nur einmal gezählt wird pro Seite in einem bestimmten Zeitraum, selbst wenn er die Seite des öfteren aktualisiert oder nach Stunden erst wieder besucht. Hits entgegen zählen einfach jeden Aufruf, egal wer es ist und wann er die Seite aufruft. Aber wie realisiert man sowas? Die Lösung heisst IP Lock. Neben der eigentlichen Tabelle, die alle Aufrufe pro Seite zählt, erstellen wir eine zusätzliche Tabelle, die alle IPs mit Zeitangabe speichert. Darauf greifen wir dann immer wieder zu, um zu überprüfen, ob der Besucher nun ein Neuer ist oder ein bereits Bekannter. Dann ran ans Werk!
Die Installation
Zunächst erstellen wir uns eine Konfigurationsdatei namens getHits.config.php:
<?php
// Verbindung zum Datenbankserver
mysql_connect(
"Dein Host", // Host
"Dein Benutzername", // User
"Dein Passwort" // Passwort
) or die("Keine Verbindung zum Datenbankserver!");
// Der Name der Datenbank muss angegeben werden!
mysql_select_db("Datenbankname")
or die("Die Datenbank ist momentan nicht erreichbar!");
?>
Danach folgt die eigentlich Installationsdatei und führen auch diese dann aus:
<?php
include("gethits.config.php");
$sql = "CREATE TABLE `modx_counter_ip` (
`ip` VARCHAR( 24 ) NOT NULL PRIMARY KEY ,
`zeit` INT NOT NULL
) ENGINE = MYISAM ;
";
if (mysql_query($sql)) {
echo "<p>Tabelle `modx_counter_ip` wurde erstellt.</p>";
}
$sql = "CREATE TABLE `modx_counter_stats` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`page` VARCHAR( 10 ) NOT NULL ,
`besucher` INT NOT NULL ,
`hits` INT NOT NULL ,
UNIQUE (
`page`
)
) ENGINE = MYISAM ;
";
if (mysql_query($sql)) {
echo "<p>Tabelle `modx_counter_stats` wurde erstellt.</p>";
}
?>
Wichtig dabei ist, dass beide Dateien im gleichen Verzeichnis abgelegt sind, sonst müsste man den Includebefehl modifizieren.
Das eigentliche Snippet
Soweit so gut. Nun der Code für das eigentliche Snippet:
<?php
// Besucherzähler "Get Hits"
// @author Hannes Letsch, Tohanwabones.de
// @copyright Copyright 2010-2011, Hannes Letsch
// @version 1.0.0 - May 28, 2011
include("gethits.config.php");
$ip = $_SERVER["REMOTE_ADDR"];
$page = $modx->resource->get('id');
// Ist die Seite schon angelegt?
if (!mysql_fetch_row(mysql_query("SELECT `page` FROM `modx_counter_stats` WHERE `page` = '" . $page . "'"))) {
// Nein, dann bitte Zeile anlegen
mysql_query("INSERT INTO `modx_counter_stats` (`page`,`besucher`,`hits`) VALUES ('" . $page . "','1','1')");
}
// Alte IP-Adresse löschen
$ablaufzeit = time() - 300; // 300 Sekunden (= 5min.) IP Sperre!
mysql_query("DELETE FROM `modx_counter_ip` WHERE `zeit` <= " . $ablaufzeit . "");
// Ist die IP-Adresse schon in der Tabelle
if (!mysql_fetch_row(mysql_query("SELECT `ip` FROM `modx_counter_ip` WHERE `ip` = '" . $ip . "ID". $page . "' "))) {
// Nein, IP-Adresse und Timestamp eintragen
mysql_query("INSERT INTO `modx_counter_ip` (`ip`,`zeit`) VALUES ('" . $ip . "ID". $page . "','" . time() . "')");
// Counter aktualisieren
mysql_unbuffered_query("UPDATE `modx_counter_stats` SET `besucher` = `besucher` + 1 WHERE `page` = '" . $page . "'");
if (mysql_affected_rows()==0) {
mysql_query("INSERT INTO `modx_counter_stats` (`page`,`besucher`) VALUES ('" . $page . "','1');");
}
}
// Hits aktualisieren
mysql_unbuffered_query("UPDATE `modx_counter_stats` SET `hits` = `hits` + 1 WHERE `page` = '" . $page . "'");
// Counter Daten von heute
list($besucher_page, $hits_page) = mysql_fetch_row(mysql_query("SELECT `besucher`,`hits` FROM `modx_counter_stats` WHERE `page` = '" . $page . "'"));
// Counter Daten gesamt
list($besucher_gesamt, $hits_gesamt) = mysql_fetch_row(mysql_query("SELECT sum(`besucher`), sum(`hits`) FROM `modx_counter_stats` WHERE 1"));
// Besucher Online
list($besucher_online) = mysql_fetch_row(mysql_query("SELECT COUNT(*) AS `ip` FROM `modx_counter_ip`"));
mysql_close();
// Templating
$tpl = $modx->getOption('tpl',$scriptProperties,'outputGetHits');
// Funktionen
$besucher = number_format($besucher_page, 0, ",", ".");
$besucherKomplett = number_format($besucher_gesamt, 0, ",", ".");
$hits = number_format($hits_page, 0, ",", ".");
$hitsKomplett = number_format($hits_gesamt, 0, ",", ".");
// Aufstellung der Placeholders:
$modx->setPlaceholder('userOnline', $besucher_online);
$modx->setPlaceholder('user', $besucher);
$modx->setPlaceholder('userAll', $besucherKomplett);
$modx->setPlaceholder('hits', $hits);
$modx->setPlaceholder('hitsAll', $hitsKomplett);
//Gib mir aus, was ich will.
$output = $modx->getChunk($tpl);
return $output;
Benutzung: Placeholder und Funktionen
Zunächst einmal rufen wir auf der gewünschten Seite unser Snippet auf:
[[!getHits? &tpl=`myTemplate`]]
Zu beachten ist dabei, dass wir mit Hilfe von &tpl unseren Chunk ansteuern, in dem der eigentliche html Output enthalten ist. Verweisen wir nicht, so wird standardmäßig auf den Chunk outputGetHits verwiesen. Existiert dieser auch nicht, wird einfach nur gezählt. Ausgegeben wird allerdings dann logischerweise nichts.
An Placeholdern darf es nicht mangeln und so bietet getHits Folgendes:
- [[+userOnline]]: Wie viele User sind gerade auf meiner Seite?
- [[+user]]: Wie viele Besucher waren auf der sichtbaren Seite?
- [[+userAll]]: Wie viele Besucher waren auf dem gesamten Webauftritt?
- [[+hits]]: Wie viele reine Aufrufe verzeichnet die aktuelle Seite?
- [[+hitsAll]]: Wie viele Aufrufe hat mein gesamter Webauftritt?












