Benutzer abmelden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Benutzer abmelden

    Ich habe bei einer kleinen Webanwendung zwei Tabellen
    • user_data
    • user_online
    In user_data steht der übliche Kram (Name, Passwort, Mail, Datum des letzten Login und Logout, ...). Die Tabelle user_online habe ich, weil ich wissen will, welcher Benutzer wo auf der Seite ist und weil ich ebenfalls wissen will, wieviel Gäste sich auf der Seite tummeln und wo die sind

    Da ich nicht bei jedem Request die Datenbank nach allen Daten fragen will, passiert das nur nach x Minuten. Was allerdings jedesmal passiert, ist ein Eintrag in die Tabelle user_online, wo ich Zeitpunkt der letzten Aktion und Position eines Benutzers/gastes festhalte. Die Identifikation läuft hier über die Session-ID.

    Anforderung ist jetzt, dass ein angemeldeter Benutzer vom Adminmenü aus abgemeldet werden kann und das auch sofort greifen soll.
    Ich schmeiße also den entsprechenden Eintrag aus user_online raus und ändere user_data (user_logout = NOW(), user_login = NULL).
    Das funktioniert auch wunderbar, bis zu dem Zeitpunkt, zu dem der abgemeldete Benutzer einen Request sendet. In der Session steht nämlich unter anderem seine User-ID, die ich ja da speichern muss, um nicht immer die Datenbank abzufragen.
    Das Aktualisieren von user_online läuft über REPLACE, so dass die User-ID aus der Session (die einem angemeldeten Benutzer entspricht) nach einem Request wieder in der Tabelle steht, obwohl der Benutzer ausgeloggt sein sollte.

    Ich überlege gerade, wie ich da am besten drangehe.

    Momentan:
    • REPLACE
    • WENN Zeitlimit (x Minuten) noch nicht erreicht $_SESSION['logged_in'] zurückliefern
    • WENN Zeitlimit überschritten
    1. $_SESSION['logged_in'] = (User-ID in user_online != ID eines Gastes)
    2. Zeitpunkt des letzten Prüfens (Zeitlimit) aktualisieren
    3. Benutzerdaten auslesen
    4. Inaktive Benutzer aus user_online schmeißen
    5. $_SESSION['logged_in'] zurückliefern


    Möglichkeit 1:
    Vor dem REPLACE lese ich user_login aus user_data (nur, wenn in der Session eine "Nicht-gast-User-ID" steht)
    Wenn das Feld NULL ist, dann wird die Methode logout() ausgeführt, die auch die Daten in der Session bereinigt

    Ich hätte dann aber bei jedem Request ein weiteres SELECT


    Möglichkeit 2:
    Wenn mysql_affected_rows() nach dem REPLACE 1 liefert, wurde ein neuer Datensatz in user_online gespeichert, danach werden die Daten auf jeden Fall geholt, auch wenn das Zeitlimit noch nicht überschritten sein sollte.
    Steht dann in der Session bei user_login der Wert NULL, wird die Methode logout() ausgeführt, die auch die Daten in der Session bereinigt.

    Erscheint mir momentan besser, da ich mir das SELECT spare (sind ja jetzt schon einige Abfragen), allerdings ist es mehr "Rumgewurschtel"


    Möglichkeit 3:
    Beim Abmelden im Adminmenü wird die Sessiondatei des Benutzers bearbeitet.
    Es wären keine Änderungen an den bestehenden Methoden nötig.

    Erscheint mir aber unelegant, außerdem wird ein eventuell vorhandes Cookie zur automatischen Anmeldung nicht gelöscht.



    Eins, zwei oder drei?
    Oder die von dir zu nennende vierte Möglichkeit?

    Ich zähl auf dich
    Zuletzt geändert von mrhappiness; 09.11.2004, 09:24.
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    OffTopic:
    Meinst du nicht, dass es noch ein bißchen früh ist

    ok, I'll try
    du kickst den User per Adminmenü und setzst user_login = NULL, warum fragst du nich einfach danach? Wenn user_login = NULL, dann zur Anmeldung redirecten, sonst normal wie bisher. (Kann auch sein, dass ich das Problem nicht richtig verstanden habe, ist noch was früh wie gesagt )

    Kommentar


    • #3
      Ist noch etwas früh

      Ja, ich setze user_login auf NULL, aber nur in der Datenbank.

      In der Session des "abgemeldeten" Benutzers habe ich nichts geändert, da komme ich über die Datenbank ja auch nicht dran, sondern wenn, dann nur indem ich die Session-Datei des Benutzers direkt ändere (das wäre Möglichkeit 3)
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        langsam komme ich in Fahrt

        mir scheint die 2. Lösung besser, obwohl sie nicht DBMS-universell ist (wegen REPLACE). i.M. fällt mir zur Lösung auch nichts besseres ein
        OffTopic:
        Aber warum willst du auf dem einen Select unbedingt verzichten? aus Zeitgründen? die paar Milisekunden macht doch nicht viel aus oder?

        Kommentar


        • #5
          Naja, den Wert von mysql_affected_rows() hab ich nach dem REPLACE auf jeden Fall, kommt von meiner DB-Klasse

          Und ich würde halt gerne weitere Abfragen vermeiden, wenn's geht; Datenbank und Webser liegen auch nicht auf demselben Rechner


          Momentan tendiere ich auch zu Möglichkeit 2, aber ich warte mal noch ab, vielleicht fällt ja jemandem noch was ein, oder auch dir, wenn du irgendwann fit bist
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar

          Lädt...
          X