Fehler im Login-System

soa

Erfahrenes Mitglied
Guten Abend,

ich arbeite bei meinem Login mit Sessions.

Darüber hinaus speichere ich die Session_id in der Datenbank und frage damit z.B. die User ab, die derzeit online sind. Beim Logout lösche ich die Session.

Code:
function logout()
   {
    $sql="UPDATE benutzer
    SET UserSession=NULL
    WHERE UserSession='".session_id()."'";
    mysql_query($sql);
   }

Wenn nun aber kein Logout erfolgt, bleibt die Session_id in der DB erhalten, wenn jemand die Seite verläßt. Was kann man da machen

Gruß
SOA
 
Du könntest zu diesem DB Eintrag abspeichern, wann der User zuletzt etwas gemacht hat. Wenn seine letzte Handlung längere Zeit zurück liegt, wird der Eintrag gelöscht.
 
Das ist keine schlechte Idee.

Wie wäre es denn, wenn ich die IP des Users in der Session speichere?

$_SESSION ["ip"] = $_SERVER['REMOTE_ADDR'];

Wenn die Session false ist, dann lösche ich die session_id aus der db...


Gruß
SOA
 
Naja,

das ist meine Funktion zum Zählen der Online User:

PHP:
function countUser()
{
     dbVerbinden();
     $sql = mysql_query("SELECT UserID FROM benutzer WHERE
     UserSession IS NOT NULL 
     AND ip IS NOT NULL");
     $count = mysql_num_rows($sql);
     echo "<b>".$count."</b>";
}

Könnte man jetzt nicht eine 2. Funktion definieren, die prüft ob z.B. die Session für die IP
leer ist und falls ja, session_id und ip aus der DB löschen?

:confused: oder kann man das Anhand der session nicht überprüfen?

Die Zeit Variante erscheint mir ziemlich komplex, da ich mehrere Tabellen dahingehend
überprüfen muss....
DANKE
 
Ich hätte mir das jetzt eher so gedacht.
In der User Tabelle 1 Spalte dazu.
last_action_time.
Auf jeder Seite lässt du dann eine Funktion ausführen,die die aktuelle Zeit in die DB schreibt. Jetzt brauchst du dann nur noch zu prüfen, ob die last_action_time wenger als 10 Minuten zurück liegt.(Nur als Bsp. Kann ja auch länger/kürzer sein). Die gefunden Einträge zählst du dann. Fertig
 
Mach eine Spalte die 'last_action' heißt und eine spalte, die 'online_status' (oder auch deine session_id) heißt...

Lass in deinem header IMMER, also bei jedem aufruf das datum eintragen und dan lässt du durch einen Cronjob alle 5 Minuten kontrollieren: Wenn 'last_action' soundso lange her ist, dann leere die Spalte 'online_status' bei ID bei ID x.

Und bei deiner statistik kannst du einfach
"SELECT * FROM tabelle WHERE online_status = 'true'";
oder so.. und das lässt du dann per mysql_num_row(); Zählen...
 
Also, vielen Dank für die Tipps.

Habe jetzt eine Zwischenlösung erstellt. Ein timeout nach etwas über einer Stunde.

PHP:
function timeout()
{
dbVerbinden();
 $zeit = time();
 $time = "SELECT
              *
              FROM benutzer
                WHERE UserSession IS NOT NULL";
    $result= mysql_query($time);
    //$result hat login zeit des users
  while ($row=mysql_fetch_assoc($result))
  {
   if ($row['login_time'] +3800000  < $zeit) 
    logout();
  }
}

Werde das später noch verfeinern....

SOA
 
Du weisst aber, dass der Datenbank diese Aktion erst das nächste Mal ausführt, wenn du wieder diese Site besuchst?!

Vielleicht würden dir "Cronjobs" etwas nützen.

Cornjobs Tutorial
 
einen Cronj :) ob könnte ich anlegen.....
Das ist ja nicht so schwer und vielleicht wäre das sogar die beste Lösung.

Die Funktion von mir sitzt auf der index im header und wird ausgeführt, wenn "irgendwer" auf die Seite geht. Falls niemand auf der Seite ist, muss auch nichts aktuelles angezeigt werden.

Es ist ja nur ein Provisorium...

Vielen Dank
 

Neue Beiträge

Zurück