Navigation überspringen

dbCF.de --- Besucherzähler mit PHP und MySQL

» Diskutieren Sie mit anderen in den Foren über diese Seite «

Das folgende Skript speichert in einer MySQL-Datenbank, wie viele Besucher man seit irgendwann hat, wie viele gerade auf der Seite sind und das Maximum, wie viele jemals gleichzeitig auf der Seite waren.
Da ich leider keine ordentliche, dauerhaft fehlerfrei laufende Version in die Welt setzen konnte, basiert das Skript nun auf MySQL.
Wer fragen haben sollte, der darf natürlich im Forum nachfragen.

Das Skript in einer Datei (z.B. counter.php) speichern und die Werte im Kopf anpassen.
Entfernen Sie vor dem ersten Durchlauf /* und */ am Anfang des Skriptes. Nach dem ersten Aufruf sollten Sie sie wieder setzen.
Das Skript mit include('counter.php'); einbinden. Die Daten kann man anschließend mit $data_counter['xxx'] ansprechen.

Nach Ablauf des Skriptes stehen dann folgende Variablen zur Verfuegung:
$data_counter['date_start'] - Start der Statistik. Für Formatierung siehe http://php.net/date
$data_counter['hits'] - Hits
$data_counter['visits'] - Besucher
$data_counter['max_online_count'] - Maximale Zahl gleichzeitiger Besucher
$data_counter['max_online_time'] - ...zu diesem Zeitpunkt. Für Formatierung siehe http://php.net/date
$data_counter['online_count'] - Zahl der Nutzer, die aktuell auf der Seite sind


<?php
// Wie lange soll IP als einmaliger Besucher gelten (in Minuten)?
$time_visits=120;
// Wie lange soll IP als aktiver Besucher gelten (in Minuten)?
$time_online=5;
// Name der Tabelle fuer die IPs
$db_name_ips='counter_ips';
// Name der Tabelle fuer die Statistik selber
$db_name_values='counter_values';

/*
mysql_query("CREATE TABLE $db_name_ips (
	ip			CHAR(15) NOT NULL PRIMARY KEY,
	last_action INT)");
mysql_query("CREATE TABLE $db_name_values (
	hits				INT,
	visits				INT,
	max_online_count	INT,
	max_online_time	 INT,
	date_start			INT)");
mysql_query("INSERT INTO $db_name_values (hits, visits, max_online_count, max_online_time, date_start)
			 VALUES (0, 0, 1, ".time().", ".time().")");
*/

// Loeschen
mysql_query("DELETE FROM $db_name_ips
			 WHERE last_action<".(time()-$time_visits*60));

$result=mysql_query("SELECT ip
					 FROM	$db_name_ips
					 WHERE	ip='{$_SERVER['REMOTE_ADDR']}'");
// Zeitstempel aktualisieren
if (mysql_num_rows($result)>0) {
	mysql_query("UPDATE $db_name_ips
				 SET	last_action=".time()."
				 WHERE	ip='{$_SERVER['REMOTE_ADDR']}'");
}
// IP mit Zeitstempel eintragen
else {
	mysql_query("INSERT INTO $db_name_ips (ip, last_action)
				 VALUES ('{$_SERVER['REMOTE_ADDR']}', ".time().")");

	// Visits erhoehen
	mysql_query("UPDATE $db_name_values
				 SET	visits=visits+1");

	// Neue Zahl maximaler gleichzeitiger Besucher speichern
	$result=mysql_query("SELECT COUNT($db_name_ips.ip) AS c_ip,
								$db_name_values.max_online_count
						 FROM	$db_name_ips,
								$db_name_values
						 WHERE	$db_name_ips.last_action>=".(time()-$time_online*60)."
						 GROUP BY $db_name_values.max_online_count");
	$data_counter=mysql_fetch_assoc($result);
	if ($data_counter['c_ip']>$data_counter['max_online_count']) {
		mysql_query("UPDATE $db_name_values
					 SET	max_online_count={$data_counter['c_ip']},
							max_online_time=".time());
	}
	$temp=$data_counter['c_ip'];
	unset($data_counter);
}

// Hits erhoehen
mysql_query("UPDATE $db_name_values
			 SET	hits=hits+1");

// Aktuelle Daten auslesen
$result=mysql_query("SELECT *
					 FROM	$db_name_values");
$data_counter=mysql_fetch_assoc($result);

// Zahl Besucher online
$result=mysql_query("SELECT COUNT(ip)
					 FROM	$db_name_ips
					 WHERE	last_action>=".(time()-$time_online*60));
list($data_counter['online_count'])=mysql_fetch_row($result);
?>

Ich übernehme natürlich keine Garantie, dass alles so klappt, wie es sollte. Für eventuelle Schäden hafte ich nicht.

Seit 08.09.2004: 4.637.331 Klicks, 835.218 Besucher, 6 online, 230 max. gleichzeitig online am 26.04.2005 um 16 Uhr