Online-Status-Anzeige

xuriorener

Mitglied
Hallo Leute,

habe ein Script gebastelt wo es mir anzeigt ob der User Online oder Offline ist.
Wenn man sich einloggt -> Online und wenn man sich ausloggt -> Offline .. logisch.. aber ich habe ein Problem .. wenn man sich nicht ausloggt bleibt der User Online .. gibt es da eine Funktion die so geht:

-- Wenn user x Minuten nicht da ist zerstöre die sessions und schreib die in DB Offline --

Danke vorraus ...



Mit freundlichen Grüßen
René | Xurio.de
 
Jo das Prinzip habe ich schon verstanden .. aber die umsetzung sieht mir ein wenig kompliziert aus ,, mir hat da jemand so einen code gegeben ..

<?
mysql_query("UPDATE meine_tabelle SET zeile = Onlines WHERE last_online_time < ".time());
?>

Habe ich gemacht ... aber er zeigt mir nun bei allen 0 an ausser die wo Online sind .. und wenn ich das Fenster schliesse wird er auch nicht auf offline gesetzt ..
 
Neuer Ansatz: Protokolliere/aktualisiere bei jeder Aktivität jedes Benutzers den Zeitpunkt. Nun kannst du ganz einfach bestimmen, welche Benutzer nicht mehr online sind, indem du eine Zeitspanne festlegst, nach der ein Benutzer als offline gilt.
 
Ich kann dir nu empfehlen hier mit timestamps zu arbeiten. Du speicherst einen timestamp in der entsprechenden Spalte. Dafür musst du der Spalte der Tabelle folgendes zuweisen: VARCHAR (11)
Also eine Spalte vom Typ Varchar und mit maximal 11 Zeichen.

Als weiteres machst du nun folgendes:

Beim Einloggen des Users nimmst du ein PHP- Script, welches dir den timestamp in der Spalte speichert, z.B.
PHP:
$sql= " UPDATE `tabelle` WHERE `user_name` = '".$_POST["user_name"]."' SET `online` = '".time()."'";
mysql_query($sql) or die ("timestamp konnte nicht gesetzt werden");

Nun musst du unterscheiden. Wenn du die Anzahl haben willst, an Usern, welche gerade online sind, kannst du das z.B. so machen:

PHP:
$zeit=time();
$onlinedauer=5*60;  // 5 mal 60 Sekunden = 5 Minuten
$online=$zeit-$onlinedauer;

// nun aus der Datenbank auslesen lassen

$sql= "SELECT * FROM `tabelle` WHERE `online` >= ".$online;
$user=mysql_query($sql);

echo "user online: ".mysql_num_rows($user);


// Für speziellen User bzw. ob ein best. User gerade online ist:

$sql= "SELECT * FROM `tabelle` WHERE `online` >= ".$online." AND `user_id` = '".$_SESSION["user_id"]."'";

if (mysql_num_rows(mysql_query($sql))
{
     echo "online";
}
else
{
     echo "offline";
}
 
Wieso keine numerischen Spaltentyp wie etwa INT, Tucker? Dieser Typ würde genau den Wertebereich eines 32-Bit-Unix-Zeitsstempels abdecken.
 
Gumbo hat gesagt.:
Wieso keine numerischen Spaltentyp wie etwa INT, Tucker? Dieser Typ würde genau den Wertebereich eines 32-Bit-Unix-Zeitsstempels abdecken.

Hatte ich vorher auch genutzt, hat aber leider nicht funktioniert. Mir hat es dabei nämlich die letzten 3 Ziffern des Zeitstempels weggeschneitten.
 
Hier mal mein kleiner Gargabe-Collector.
Der funktioniert im Grunde nach dem Prinzip das Gumbo in seiner ersten Antwort beschrieben hat.
PHP:
<?php
$session_prefix="sess_";
$sessions=mysql_query("select * from sessions",$mydb);
while ($session=mysql_fetch_assoc($sessions))
	{
		if (file_exists($session_path."/".$session_prefix.$session['sessionid']))
			{
				if (filectime($session_path."/".$session_prefix.$session['sessionid'])+600<time())
					{
						unlink($session_path."/".$session_prefix.$session['sessionid']);
					}
			}
		if (!file_exists($session_path."/".$session_prefix.$session['sessionid']))
			{
				if ($session['userid']!=0)
					{
						$logouttime=time();
						mysql_query("update users set lastseen='".$logouttime."',logintime='' where id='".$session['userid']."'",$mydb);
					}
				mysql_query("delete from sessions where sessionid='".$session['sessionid']."'",$mydb);
			}
	}
?>
 
Zurück