Kermit
02.01.2005, 20:45
In diesem Tutorial möchte ich einem einfachen Weg beschreiben, wie man auf seiner Webseite anzeigen lassen kann, wie viele Besucher online sind. Ich versuche dabei auch auf ein par Befehle einzugehen, damit man aus dem Tutorial auch noch was lernen kann und nicht einfach den Code mit Copy-Paste benutzt.
Habt ein wenig Nachsicht mit mir, da dies mein erstes Script Tutorial ist.
Vorraussetzungen:
- PHP
- MySQL Datenbank
Als erstes erstellen wir eine config-Datei, in der wir unsere Login Daten für die MySQL Datenbank ablegen, damit wir die nicht in jedem Script neu eingeben müssen.
Inhalt der Datei counterconfig.inc.php
<?php
$host = ""; //Hostname
$user = ""; //Datenbank User
$data = ""; //Datenbank Name
$pass = ""; //Passwort
?>
Jetzt müssen wir erstmal die benötigte Tabelle in unserer Datenbank anlegen. Dazu basteln wir uns eine Installationsdatei. Man könnte es auch über phpMyAdmin machen, aber vielleicht wollen wir den Script ja später noch wo anders einsetzen, dann haben wir schon ne fertige Installation.
Also includieren wir zuerst unsere Datei mit den Login Daten. Danach versuchen wir eine Verbindung zur Datenbank aufzubauen. Mit dem @ vor dem Befehl $db = mysql_connect unterdrücken wir eine Fehlermeldung, falls der Verbindungsaufbau nicht erfolgreich war. Das vermeidet die unschöne PHP Fehlermeldung, die wir lieber durch eine eigene ersetzen. Dies erfolgt im nächsten Schritt. Wir überprüfen, mit Hilfe einer if-Abfrage, ob die Verbindung erfolgreich war. Wenn nicht, wird ein Text ausgegeben. Ist die Verbindung jedoch erfolgreich, wählen wir die Datenbank aus, in der unsere Tabelle erzeugt werden soll. Jetzt legen wir die Tabelle an. Dabei brauchen wir zwei spalten, eine für die IP, damit wir die Besucher eindeutig identifizieren können, und eine für den Timestamp. Der Timestamp ist eine Zahl, die die vergangenen Sekunden, seit dem 1.1.1970 beschreibt. Daran können wir hinterher festmachen, wann der letzte Besuch war. Das anlegen der Tabelle wird wieder über eine if-Abfrage auf Erfolg überprüft. Ist die Datei fertig können wir sie hochladen und ausführen. Eine Meldung sollte uns dann über Erfolg oder Misserfolg informieren.
Inhalt der Datei install.php
<?php
include ("counterconfig.inc.php");
@$db = mysql_connect($host, $user, $pass); // Verbindung aufbauen
if ($db)
{
mysql_select_db($data,$db); // Datenbank auswählen
// Tabelle in die DB einfügen
@$success = mysql_query("create table user_online
(ip char(15), timestamp int);", $db);
if ($success)
{
echo'Tabelle angelegt';
}
else
{
echo'Tabelle konnte nicht angelegt werden';
}
mysql_close($db); //Datenbankverbindung schließen
}
else
{
echo'Datenbankverbindung konnte nicht aufgebaut werden';
}
?>
Am sinnigsten ist es nun eine weitere Datei anzulegen, die wir in jede Datei includieren können, die Seitenaufrufe zählen soll, damit wir den kompletten Code nicht mehrmals schreiben müssen. Als erstes werden hier wieder die Login Daten geholt. Danach werden Konstanten festgelegt, die wir später im Script noch brauchen. Die erste ist die Zeit, die die IPs gespeichert bleiben sollen. Ein sinnvoller Wert sind hier 300 Sekunden, was 5 Minuten sind. Zu niedrig sollte man den Wert nicht ansetzen, da es ja vorkommen kann, dass jemand auf der Seite einen Text ließt und dann logischerweise nicht aktualisiert. Zu hoch sollte es aber auch nicht sein. Die zweite Konstante gibt uns den aktuellen an. Dieser wird über die Funktion time() ermittelt.
Jetzt folgt wieder die oben schon beschriebene Verbindung mit der Datenbank. Diesmal lassen wir jedoch eine Fehlermeldung weg, falls die Verbindung nicht erfolgreich ist, da es sich hier um eine include Datei handelt, die in andere Seiten eingebaut wird. Da das meistens im Kopf der anderen Dateien erfolgt, würde so eine Meldung das Design der Seite beeinflussen, oder gar den Versand eine Seitenheaders beeinflussen.
Nun müssen wir überprüfen, ob der User schon vorhanden ist, oder nicht. Dazu zählen wir die Zeilen in der Datenbank, die die IP des Users enthalten. Die IP können wir uns mit Hilfe der Server Konstante $_SERVER[REMOTE_ADDR] holen. Das Ergebnis der Datenbankabfrage übergeben wir dann mittels mysql_fetch_assoc in einen assoziativen Array. Dieser Array enthält nun die Anzahl der ermittelten Zeilen. Also 1 wenn die IP schon vorhanden ist, oder 0, wenn die IP noch nicht vorhanden ist. Dieses Ergebnis werten wir jetzt mit einem switch aus. Wenn der User neu ist, dann wird für ihn eine neue Zeile in die Tabelle geschrieben, mit seiner IP und dem oben ermittelten Timestamp. Wenn der User schon in der Tabelle vorhanden ist, dann wird sein Timestamp aktualisiert. Denn wir wollen ja nicht, dass er als inaktiv eingestuft wird, wenn er noch da ist.
Als letzen Schritt brauchen wir nun nur noch die User zu löschen, die sich seit unserer festgelegten Zeit nicht mehr gerührt haben. Dazu Ziehen wir die 5 Minuten von dem aktuellen Timestamp ab und haben dann den Timestamp von vor 5 Minuten. Jetzt löschen wir einfach alles, was älter als dieser Timestamp ist. Da Timestamps eine fortlaufende Zahl sind, können wir das mit dem Vergleichsoperator < leicht realisieren.
Inhalt der Datei counter.inc.php
<?php
include ("counterconfig.inc.php");
// Konstanten definieren
define(DELTIME, 300); // Zeit die die IPs gespeichert bleiben (in sec)
$time = time(); // Aktueller Timestamp
@$db = mysql_connect($host, $user, $pass); // Verbindung aufbauen
if ($db)
{
mysql_select_db($data,$db); // Datenbank auswählen
$index = mysql_query("select count(*) as count
from user_online
where ip='$_SERVER[REMOTE_ADDR]'");
$rows = mysql_fetch_assoc($index);
switch ($rows[count])
{
case 0: // IP noch nicht vorhaden
mysql_query("insert into user_online (ip, timestamp)
values ('$_SERVER[REMOTE_ADDR]', $time)", $db);
break;
case 1: // IP schon vorhanden - timestamp aktualisieren
mysql_query("update user_online
set timestamp = $time
where ip = '$_SERVER[REMOTE_ADDR]'", $db);
break;
}
// User löschen, die DELTIME nicht aktiv waren
$deltime = $time - DELTIME;
mysql_query("delete from user_online
where timestamp < $deltime", $db);
mysql_close($db); //Datenbankverbindung schließen
}
?>
Was jetzt noch fehlt ist eine Anzeige auf der Seite, wie viele User denn nun online sind. Die Baut sich ähnlich wie die vorherige auf. Nur dass diesmal nicht in die Datenbank geschrieben, sondern etwas ausgelesen wird. Als erstes wird wieder die Anzahl der Zeilen ermittelt. Diesmal aber aller Zeilen. Das ist dann auch schon unser Wert, der aktiven User. Mittels einer switch abfrage widmen wir uns dann noch der Kosmetik, damit die Grammatik stimmt. In der Ausgabe sollte man ein "ca." einbauen, da der Wert nie 100%ig stimmt.
Die gerade erzeugte Datei kann man nun in seine Seite an der Stelle einbauen, wo die Ausgabe der Online User erfolgen soll. Entweder direkt mit dem Code, oder über ein include.
Inhalt der Datei counter.php
<?php
include ("counterconfig.inc.php");
@$db = mysql_connect($host, $user, $pass); // Verbindung aufbauen
if ($db)
{
mysql_select_db($data,$db); // Datenbank auswählen
$index = mysql_query("select count(*) as count
from user_online");
$rows = mysql_fetch_assoc($index);
switch ($rows[count])
{
case 1:
echo 'Es ist ca. '.$rows[count].' User online';
break;
default:
echo 'Es sind ca. '.$rows[count].' User online';
break;
}
mysql_close($db); //Datenbankverbindung schließen
}
?>
Habt ein wenig Nachsicht mit mir, da dies mein erstes Script Tutorial ist.
Vorraussetzungen:
- PHP
- MySQL Datenbank
Als erstes erstellen wir eine config-Datei, in der wir unsere Login Daten für die MySQL Datenbank ablegen, damit wir die nicht in jedem Script neu eingeben müssen.
Inhalt der Datei counterconfig.inc.php
<?php
$host = ""; //Hostname
$user = ""; //Datenbank User
$data = ""; //Datenbank Name
$pass = ""; //Passwort
?>
Jetzt müssen wir erstmal die benötigte Tabelle in unserer Datenbank anlegen. Dazu basteln wir uns eine Installationsdatei. Man könnte es auch über phpMyAdmin machen, aber vielleicht wollen wir den Script ja später noch wo anders einsetzen, dann haben wir schon ne fertige Installation.
Also includieren wir zuerst unsere Datei mit den Login Daten. Danach versuchen wir eine Verbindung zur Datenbank aufzubauen. Mit dem @ vor dem Befehl $db = mysql_connect unterdrücken wir eine Fehlermeldung, falls der Verbindungsaufbau nicht erfolgreich war. Das vermeidet die unschöne PHP Fehlermeldung, die wir lieber durch eine eigene ersetzen. Dies erfolgt im nächsten Schritt. Wir überprüfen, mit Hilfe einer if-Abfrage, ob die Verbindung erfolgreich war. Wenn nicht, wird ein Text ausgegeben. Ist die Verbindung jedoch erfolgreich, wählen wir die Datenbank aus, in der unsere Tabelle erzeugt werden soll. Jetzt legen wir die Tabelle an. Dabei brauchen wir zwei spalten, eine für die IP, damit wir die Besucher eindeutig identifizieren können, und eine für den Timestamp. Der Timestamp ist eine Zahl, die die vergangenen Sekunden, seit dem 1.1.1970 beschreibt. Daran können wir hinterher festmachen, wann der letzte Besuch war. Das anlegen der Tabelle wird wieder über eine if-Abfrage auf Erfolg überprüft. Ist die Datei fertig können wir sie hochladen und ausführen. Eine Meldung sollte uns dann über Erfolg oder Misserfolg informieren.
Inhalt der Datei install.php
<?php
include ("counterconfig.inc.php");
@$db = mysql_connect($host, $user, $pass); // Verbindung aufbauen
if ($db)
{
mysql_select_db($data,$db); // Datenbank auswählen
// Tabelle in die DB einfügen
@$success = mysql_query("create table user_online
(ip char(15), timestamp int);", $db);
if ($success)
{
echo'Tabelle angelegt';
}
else
{
echo'Tabelle konnte nicht angelegt werden';
}
mysql_close($db); //Datenbankverbindung schließen
}
else
{
echo'Datenbankverbindung konnte nicht aufgebaut werden';
}
?>
Am sinnigsten ist es nun eine weitere Datei anzulegen, die wir in jede Datei includieren können, die Seitenaufrufe zählen soll, damit wir den kompletten Code nicht mehrmals schreiben müssen. Als erstes werden hier wieder die Login Daten geholt. Danach werden Konstanten festgelegt, die wir später im Script noch brauchen. Die erste ist die Zeit, die die IPs gespeichert bleiben sollen. Ein sinnvoller Wert sind hier 300 Sekunden, was 5 Minuten sind. Zu niedrig sollte man den Wert nicht ansetzen, da es ja vorkommen kann, dass jemand auf der Seite einen Text ließt und dann logischerweise nicht aktualisiert. Zu hoch sollte es aber auch nicht sein. Die zweite Konstante gibt uns den aktuellen an. Dieser wird über die Funktion time() ermittelt.
Jetzt folgt wieder die oben schon beschriebene Verbindung mit der Datenbank. Diesmal lassen wir jedoch eine Fehlermeldung weg, falls die Verbindung nicht erfolgreich ist, da es sich hier um eine include Datei handelt, die in andere Seiten eingebaut wird. Da das meistens im Kopf der anderen Dateien erfolgt, würde so eine Meldung das Design der Seite beeinflussen, oder gar den Versand eine Seitenheaders beeinflussen.
Nun müssen wir überprüfen, ob der User schon vorhanden ist, oder nicht. Dazu zählen wir die Zeilen in der Datenbank, die die IP des Users enthalten. Die IP können wir uns mit Hilfe der Server Konstante $_SERVER[REMOTE_ADDR] holen. Das Ergebnis der Datenbankabfrage übergeben wir dann mittels mysql_fetch_assoc in einen assoziativen Array. Dieser Array enthält nun die Anzahl der ermittelten Zeilen. Also 1 wenn die IP schon vorhanden ist, oder 0, wenn die IP noch nicht vorhanden ist. Dieses Ergebnis werten wir jetzt mit einem switch aus. Wenn der User neu ist, dann wird für ihn eine neue Zeile in die Tabelle geschrieben, mit seiner IP und dem oben ermittelten Timestamp. Wenn der User schon in der Tabelle vorhanden ist, dann wird sein Timestamp aktualisiert. Denn wir wollen ja nicht, dass er als inaktiv eingestuft wird, wenn er noch da ist.
Als letzen Schritt brauchen wir nun nur noch die User zu löschen, die sich seit unserer festgelegten Zeit nicht mehr gerührt haben. Dazu Ziehen wir die 5 Minuten von dem aktuellen Timestamp ab und haben dann den Timestamp von vor 5 Minuten. Jetzt löschen wir einfach alles, was älter als dieser Timestamp ist. Da Timestamps eine fortlaufende Zahl sind, können wir das mit dem Vergleichsoperator < leicht realisieren.
Inhalt der Datei counter.inc.php
<?php
include ("counterconfig.inc.php");
// Konstanten definieren
define(DELTIME, 300); // Zeit die die IPs gespeichert bleiben (in sec)
$time = time(); // Aktueller Timestamp
@$db = mysql_connect($host, $user, $pass); // Verbindung aufbauen
if ($db)
{
mysql_select_db($data,$db); // Datenbank auswählen
$index = mysql_query("select count(*) as count
from user_online
where ip='$_SERVER[REMOTE_ADDR]'");
$rows = mysql_fetch_assoc($index);
switch ($rows[count])
{
case 0: // IP noch nicht vorhaden
mysql_query("insert into user_online (ip, timestamp)
values ('$_SERVER[REMOTE_ADDR]', $time)", $db);
break;
case 1: // IP schon vorhanden - timestamp aktualisieren
mysql_query("update user_online
set timestamp = $time
where ip = '$_SERVER[REMOTE_ADDR]'", $db);
break;
}
// User löschen, die DELTIME nicht aktiv waren
$deltime = $time - DELTIME;
mysql_query("delete from user_online
where timestamp < $deltime", $db);
mysql_close($db); //Datenbankverbindung schließen
}
?>
Was jetzt noch fehlt ist eine Anzeige auf der Seite, wie viele User denn nun online sind. Die Baut sich ähnlich wie die vorherige auf. Nur dass diesmal nicht in die Datenbank geschrieben, sondern etwas ausgelesen wird. Als erstes wird wieder die Anzahl der Zeilen ermittelt. Diesmal aber aller Zeilen. Das ist dann auch schon unser Wert, der aktiven User. Mittels einer switch abfrage widmen wir uns dann noch der Kosmetik, damit die Grammatik stimmt. In der Ausgabe sollte man ein "ca." einbauen, da der Wert nie 100%ig stimmt.
Die gerade erzeugte Datei kann man nun in seine Seite an der Stelle einbauen, wo die Ausgabe der Online User erfolgen soll. Entweder direkt mit dem Code, oder über ein include.
Inhalt der Datei counter.php
<?php
include ("counterconfig.inc.php");
@$db = mysql_connect($host, $user, $pass); // Verbindung aufbauen
if ($db)
{
mysql_select_db($data,$db); // Datenbank auswählen
$index = mysql_query("select count(*) as count
from user_online");
$rows = mysql_fetch_assoc($index);
switch ($rows[count])
{
case 1:
echo 'Es ist ca. '.$rows[count].' User online';
break;
default:
echo 'Es sind ca. '.$rows[count].' User online';
break;
}
mysql_close($db); //Datenbankverbindung schließen
}
?>