Problem mit Sessions bzw. Logout

nikwithk

Mitglied
servus.

ich hab ein portal geschrieben dass ein forum, pn's, gallery, chat usw. beinhaltet... im footer hab ich eine User Online anzeige, die folgendermaßen funktioniert: Nach dem Login wird eine Session gespeichert, Passwort und Username verglichen und wenn alles erfolgreich war ins DB Feld status "online" eingetragen. Der Online Counter zählt dann einfach bei wie vielen usern der status "online" ist und gibt diese zahl aus. Beim Logout wird dann in diese Tabelle wieder "offline" geschrieben.... Mein Problem: Wenn die User nicht auf Logout klicken sondern das Fenster einfach schließen wird ihr status nicht offline gesetzt und sie gelten immer noch als online! Hab schon alles probiert aber es will mir einfach nicht gelingen! Irgendeiner eine Idee!?

Danke schon mal... Mfg nik ;-)
 
Schreib doch anstatt "online" das aktuelle Datum in das DB Feld. Du wirst ja sicherlich bei jeder geschützten Seite dann überprüfen, ob jemand angemeldet ist. Schließlich setzt du dann bei diesem User wieder das aktuelle Datum.
Im Footer liest du dann nur die Felder aus, deren Datum größer als das Datum minus meinetwegen 10 Minuten ist und schon hast du es.

Mit freundlichem Gruß
der_maiki
 
hmm... hab mir mal was überlegt... kanns aber noch nicht test weil ich noch beim arbeiten bin :( könnts so gehen:
PHP:
$time_to_del = 30*60; //des müssten 30 min. sein oder!?
$differenz = time()-$time_to_del;
und der query ca. so!
PHP:
$query = mysql_query("SELECT * FROM members WHERE status < '$differenz'");
 
Zuletzt bearbeitet:
gut danke dir für den tip.... ich probiers mal

Aber wenn jemand noch ne Idee für ne andere Lösung hätte... Ich bin für alles offen :)
 
Unter PHP "leben" Sessions standardmaessig 24 Minuten, das heisst wenn ein User 24 Minute inaktiv war wird er zum Ziel des Garbage Collectors.
Dieser wird, je nach Einstellung, bei einem gewissen Prozentsatz an session_start()-Aufrufen ausgefuehrt.
Das hab ich mir zu nutze gemacht und ueberpruefe ob das Session-File noch vorhanden ist, wenn nicht wird der entsprechende Eintrag aus der DB geloescht.
Es gibt also fuer jedes Session-File einen DB-Eintrag, nicht mehr, nicht weniger.
Da ich natuerlich bei meinem Anbieter nicht auf das Verzeichnis zugreifen darf in dem die Sessions standardmaessig gespeichert werden musste ich das per session_save_path() in ein eigenes Verzeichnis verlegen. Das Problem hierbei ist jedoch, dass da der Garbage Collector nicht durchgeht.
Ich musste nun also meine eigene Garbage Collection schreiben, welche ich dann mit einer Zeit von nur 10 Minuten ausgestattet hab, statt der standardmaessigen 24 Minuten.
Der Code ist ein wenig komplexer, da er mit im Cookie-Check drinhaengt. Der ist dafuer da um festzustellen ob der User Cookies deaktiviert hat und dies soll mit der Session in der DB gespeichert werden um das Login mit und ohne Cookies zu ermoeglichen.

Hier mal die Scripts: ;)
Uebrigens, die sessioncheck.php wird in meiner index.php includet, das sieht da so aus:
PHP:
$sessioncheckcaller="index.php";
include("sessioncheck.php");

sessionpath.php
PHP:
<?
$session_path="../tmp";
session_save_path($session_path);
?>

sessioncheck.php
PHP:
<?
include("sessionpath.php");
include("cleansessions.php");
if ($_GET["sessionid"])
	{
		$sessionid=$_GET["sessionid"];
		session_id($sessionid);
	}
session_start();
if (!$sessionid)
	{
		$sessionid=session_id();
	}
$sessions=mysql_query("select * from sessions where sessionid='$sessionid'",$db);
$session=mysql_fetch_array($sessions);
if (!$session)
	{
		header("Location:cookiecheck.php?caller=".$sessioncheckcaller."&sessionid=".$sessionid);
	}
$sessionname=session_name();
if ((($session[2]=="0") && ($_COOKIE[$sessionname])) || (($session[2]=="1") && (!$_COOKIE[$sessionname])))
	{
		session_regenerate_id();
		session_destroy();
		header("Location:".$sessioncheckcaller);
	}
if ($session[2]=="1")
	{
		$sessionparm="";
		$sessionparm_link="";
		$sessionparm_header="";
	}
else
	{
		$sessionparm="?sessionid=".$sessionid;
		$sessionparm_link="&amp;sessionid=".$sessionid;
		$sessionparm_header="&sessionid=".$sessionid;
	}
?>

cleansessions.php
PHP:
<?
$session_prefix="sess_";
$sessions=mysql_query("select * from sessions",$db);
while ($session=mysql_fetch_row($sessions))
	{
		if (file_exists($session_path."/".$session_prefix.$session[0]))
			{
				if (filemtime($session_path."/".$session_prefix.$session[0])+600<time())
					{
						unlink($session_path."/".$session_prefix.$session[0]);
					}
			}
		if (!file_exists($session_path."/".$session_prefix.$session[0]))
			{
				mysql_query("delete from sessions where sessionid='$session[0]'",$db);
			}
	}
?>

cookiecheck.php
PHP:
<?
if (($_GET["sessionid"]) && ($_GET["caller"]))
	{
		$sessionid=$_GET["sessionid"];
		$caller=$_GET["caller"];
		include("sessionpath.php");
		session_id($sessionid);
		session_start();
		if (!$_GET["check"])
			{
				setcookie("test","test",time()+3600);
				header("Location:cookiecheck.php?sessionid=".$sessionid."&check=1&caller=".$caller);
			}
		else
			{
				if ($_COOKIE["test"]=="test")
					{
						$cookies="1";
					}
				else
					{
						$cookies="0";
					}
				include("connectdb.php");
				mysql_select_db("database",$db);
				mysql_query("insert into sessions (sessionid,cookies) values ('$sessionid','$cookies')",$db);
				$db=mysql_close($db);
				setcookie("test","test",time()-3600);
				if ($cookies=="1")
					{
						header("Location:".$caller);
					}
				else
					{
						header("Location:".$caller."?sessionid=".$sessionid);
					}
			}
	}
?>
 
wow... danke dir....

genau nach so einer lösung hab ich gesucht! Aber da wär ich niemals draufgekommen...
Funktioniert perfekt! :)

thx nikwithk
 
Zurück