PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Tutorial] User Online Script



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
}

?>

Rolus
02.01.2005, 21:06
Hab's eben mal überflogen und ich muss sagen: Nicht schlecht!
Okay, da das dein erstes Skript-Tutorial ist, wie du sagst, will ich auch nicht zuviel kritisieren. Nimm's einfach als gut gemeinte Tipps auf, okay? :p
Sind auch nur Kleinigkeiten, die wohl etwas mit deinem Skripting-Stil zu tun haben.
1.) "count(*) as count" ist für Anfänger sehr unschön. Eins ist eine Variable, das andere nicht und beides wird gleich geschrieben. Ich würe Zähler oder sowas nehmen.
2.)MySql-Befehle (select usw.) sind im ersten Code-Abschnitt groß (wie sich das gehört) und in den folgenden Abschnitten klein geschrieben. In einem Tutorial sollte man gerade bei sowas auf Einheitlichkeit achten, d.h. ich würde sie immer groß schreiben. Unabhängig davon, wie du es privat für dich machst.
Naja, trotzdem echt gutes Tutorial. Aber da habe ich noch eine Frage an dich. Weißt du welchen Zeitintervall der Counter hier im Forum hat? Mir kommt es immer so vor, als ob er recht groß sei. Also wenn jemand den Browser ausschaltet ohne sich auszuloggen wird er doch mindestens noch 10 Minuten angezeigt, oder?

freundliche Grüße, Rolus

Kermit
02.01.2005, 21:22
zu 1. hm, ja.. wie man will

zu 2. Stimmt, Mix-Schreibweise ist dumm, hatte das mit dem Create wo anders raus kopiert. Habs jetzt auch klein gemacht. Ich bin absolut kein Fan von dieser verkniffenen Großschreibung von diesen Sachen. Ich schreib in meinen scripten wirklich nur das groß, was nicht vermeidbar ist, da es keinerlei Einfluss auf die Lauffähigkeit hat aber wesentlich schneller zu tippen ist.

Wie lange das Forum die Sachen speichert weiß ich nicht, aber ich würde auch auf 10 min tippen, was bei einem Forum sinnvoll ist, da es ja öfter vorkommt (oder zumindest sollte) das man ganze Threads ließt. Da ist man dann länger ohne Bewegung.

TheGladiator
03.01.2005, 17:20
schönes tutorial. der übungseffekt ist zwar da aber das ergebnis ist ein bisschen gering. ist es eigentlich viel aufwendiger ein skript zu schreiben das gleich auch noch das ganze zählt (also heute, gestern und gesamt)?

Rolus
03.01.2005, 17:50
ist es eigentlich viel aufwendiger ein skript zu schreiben das gleich auch noch das ganze zählt (also heute, gestern und gesamt)?
Nö, du musst quasi das gleiche nochmal machen. Einmal werden die alten Einträge nur jeden Tag rausgeschmissen und einemal wird ein Wert einfach erhöht. Die IP muss man bei dem allgemeinen Counter IMHO nicht speichern.

freundliche Grüße, Rolus