Ich habe bei einer kleinen Webanwendung zwei Tabellen
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:
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
- user_data
- user_online
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
- $_SESSION['logged_in'] = (User-ID in user_online != ID eines Gastes)
- Zeitpunkt des letzten Prüfens (Zeitlimit) aktualisieren
- Benutzerdaten auslesen
- Inaktive Benutzer aus user_online schmeißen
- $_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
Kommentar