Logout oder Fenster schliessen

EuroCent

Klappstuhl 2.0
Hallo sitze vor folgendem Problem:

Wenn sich ein User bei mir Anmeldet und nach 5min den Browser schliesst ohne sich auszuloggen dann steht er weiterhin auf Online. Kommt er erneuert rein muss er sich anmelden da mein System mit session läuft, meine Session dauern solange an wie sein Browserfenster auf ist!

Gibt es nun eine Möglichkeit es zu realisieren das wenn der User XYZ bei seinem Browser auf schliessen geht das er automatisch ausgeloggt ist? Oder funktioniert das dann nicht!

Den normal würde mir reichen wenn sein Online Status nach dem er das Fenster geschlossen hat auf Offline steht und seine Letzte Aktion in Zeit gespeichert wird!

Wie kann ich das realisieren?

Danke euch
 
Du könntest ein Cronjob schreiben, der alle 5 Minuten alle OnlineUser löscht.

lg

Hä... und was soll mir das bringen dann werden auch die als Offline geführt die aber Online sind?

Ich möchte lediglich eigentlich auch nur abfangen das wenn jemand den schliessen button seines Fensters betätigt oder wie auch immer Offline gestellt wird...!

Hab es bei mir so:

PHP:
<?
session_start();
$sid = session_id();
require("templates.php");

//Verbindungsdaten
$sqlhost = "localhost";
$sqluser = "xxx";
$sqlpass = "xxx";
$sqldata = "wms";
//Verbindung herstellen
mysql_connect($sqlhost, $sqluser, $sqlpass) or die("Verbindung fehlgeschlagen!");
//Selektieren der DB
mysql_select_db($sqldata) or die("Datenbank konnte nicht gefunden werden!");

//Eingeloggt
$sql = mysql_query("SELECT * FROM mitglieder WHERE usersess='".$_REQUEST['sid']."'");
	while($users = mysql_fetch_array($sql)) {
		$userid = $users['userid'];
		$username = $users['username'];
		$admin = $users['is_admin'];
		$mod = $users['is_mod'];
		$usersess = $users['usersess'];
		$lastlogin = $users['lastlogin'];
		$sesstime = $users['sesstime'];
		$group_id = $users['group_id'];
	}
	
	$tpl = &new dbbtpl('./templates/cache', './templates', 0);

		// Header-CSS	
		eval("\$css = \"".$tpl->get("css")."\";");
		//Header
		eval("\$header = \"".$tpl->get("header")."\";");
		//Footer
		eval("\$footer = \"".$tpl->get("footer")."\";");
?>
 
Ich möchte lediglich eigentlich auch nur abfangen das wenn jemand den schliessen button seines Fensters betätigt oder wie auch immer Offline gestellt wird...!

Hallo

das geht nicht, das ist auch gut so.

Du musst das über ein Insert- bzw. Update-Statement auf eine Tracking-Tabelle lösen. Hier setzt Du einen Zeitraum ein z.B. 5 Min., in dem der User möglicherweise keinen Klick auf Deiner Seite abgeben könnte.

Jeder Klick, der innerhalb der Zeit erfolgt, setzt ein Update auf die Zeit der IP. Ist die Zeit überschritten (z.b. nach 5 Min), wird der Datensatz gelöscht und der nächste Klick, z.B. nach 6 Min. wird wieder ein Insert mit IP und Zeit.
 
Sry, jetzt fällt mir wieder die effektivste Methode ein:

Du brauchst eine Tabelle "user_online" oder machst die Spalten der Tabelle woanderst rein ;-)

user_online:
id, int, 11, unsigned, not null, , auto_increment, primary, ,
userid, int, 11, unsigned, not null
time, int, 11, unsigned, not null,

config.inc.php
PHP:
<?php
$USER_ON_TIME = 5*60; // Onlinezeit: 5 Minuten
?>

Script welches in dein Teil kommt, den nur eingeloggte zu sehen bekommen:
PHP:
<?php
include('config.inc.php');
$min_time = time()-$USER_ON_TIME;

$sql = "SELECT * FROM `user_online` WHERE `userid` = '$userid' AND `time` > '$min_time' "; // USERID ist die Userid
$result = mysql_query($sql);

if(mysql_num_rows($result) < 1){
  $sql = "INSERT INTO `user_online`(`userid`, `time`) Values ('$userid', ' ".time()." ' )";
  mysql_query($sql);
}
else {
  $sql = "UPDATE `user_online` SET `time` = '".time()."' WHERE `userid` = '$userid'"; 
  mysql_query($sql);
}
?>

So, jetzt noch die Useronline Abfrage:
PHP:
<?php
include('config.inc.php');
$min_time = time()-$USER_ON_TIME;

$sql = "SELECT * FROM `user_online` WHERE `time` > '$min_time'";
$result = mysql_query($sql);
$amount = mysql_num_rows($result);
echo "Zur Zeit sind {$amount} User online!";
?>
 
Nein mir geht es darum das User die sich nicht ausgeloggt haben sondern nur den Browser geschlossen haben das man da irgendwie überprüfen könnte ob er noch aktiv ist!

Den wenn ich mich einlogge und dann mein Fenster schliesse aus welchen gründen auch immer dann stehe ich solange Online bis ich mich einlogge und wieder auslogge!

Und genau das soll nicht passieren... hab mir eben gedacht sobald ein User sein Fenster schliesst das er automatisch ausgeloggt wird... aber wie realisiert man sowas?

Oder gibt es da eine einfache Methode dies einfacher zu gestalten

Ich hab eine Tabelle mitglieder da wird: userid, username, usersess, online, lastlogin und sesstime gespeichert

Hofffe man weiss nun was ich möchte ;)
 
Ich würde bei jedem Aufruf einfach alle User die länger als X Minuten inaktiv waren (am Besten du erweiterst deine Tabelle um ein Feld lastaction) als offline kennzeichnen.

Nachteil ist halt, dass du bei jeder neuen Aktion das Feld aktualisieren müsstest.
Aber den ganzen Code könnte man ja bequem in eine Funktion packen, dann sollte das gehen.

Mit Browser schließen ist das so eine Sache, da PHP nicht alleine interaktiv reagieren kann. Da müsstest du also eine Verbindung mit JavaScript schalten, was wieder bei Usern, die kein JavaScript aktiviert haben, nicht funktioniert.
 
sobald ein User sein Fenster schliesst das er automatisch ausgeloggt wird... aber wie realisiert man sowas?

Hab sowas zwar noch nicht implementiert, aber ich eine Idee wäre, über den JavaScript-EventHandler onclose einen HTTPXMLRequest mit der Logout-Anweisung abzusetzen.

Nachteile:
-Funktioniert nur wenn der User JavaScript zulässt
-macht u.U. eine Browserweiche erforderlich (wegen unterschiedlichem Eventmodell von IE und FF)
-weiß nicht genau, ob der Ansatz so wirklich funktionieren kann :)
 
Ich würde bei jedem Aufruf einfach alle User die länger als X Minuten inaktiv waren (am Besten du erweiterst deine Tabelle um ein Feld lastaction) als offline kennzeichnen.

Genau das habe ich versucht mit dem obigem PHP Script auszudrücken.

Mit Browser schließen ist das so eine Sache, da PHP nicht alleine interaktiv reagieren kann. Da müsstest du also eine Verbindung mit JavaScript schalten, was wieder bei Usern, die kein JavaScript aktiviert haben, nicht funktioniert.

onUnLoad hilft dir vll...

lg
 
Du erstellst ein neues SQL Kommando der alle user und alle herausfiltert die z.B in der datenbank auf online sind und wenn z.B vom Zeitpunkt (von der einloggzeit die immer aktualisiert wird) <= 5 ist dann wird offline angezeigt! naja so muss es eigentlich gehen..

MfG
KD3
 
Zurück