User Loginzeit berechnen

Hallo,

ich habe mal wieder ein Problem ich hoffe ihr könnt mir helfen. Ich habe in einer Datenbank mehrere Benutzer, die sich einloggen und ausloggen können. Jeder Login und jeder Logout wird in einer Tabelle mit einer ID versehen und mit dem jeweiligen Timestamp gespeichert.
Jetzt möchte ich die Loginzeit des Benutzers ermitteln und zwar in einem beliebigen Zeitraum (zb. Heute, der gesamten Woche, usw).
Das Problem was auftaucht ist, dass Benutzer sich mehrmals am Tag ein- und ausloggen und wenn das Browserfenster einfach geschlossen wird kein Logouteintrag in der Datenbank erstellt wird.
Ich möchte die Zeit aber exakt haben. Ich kann zwar die Zeit zwischen dem letzten Login und der letzten Aktion relativ genau bestimmen, aber das reicht mir als Lösung nicht.
Eine alternative Lösung wäre, dass ich anstatt einem "logout"-Eintrag bei jeder Aktion des Benutzers den letzten Eintrag mit dem aktuellen Timestamp überschreibe, somit wird der logout-Eintrag überflüssig und ich kann einfach die Zeit zwischen dem letzten Login und dem letzten aktuallisierungs-Eintrag berechnen. Was haltet ihr von dieser Lösung?
Problem: Wie berechne ich diese Zeit wenn mehrere Einträge vorliegen und ich die gesamte Zeit in einem beliebigen Zeitraum errechnen möchte?
Ich hoffe ihr könnt mir bei meinem Problem helfen.

mfG Prophion
 
Du hast zwar genau erklärt was du willst aber nichts dazu gesagt wo und wo die Daten abgelegt sind. Welches Datenbanksystem? Wie heißen die Tabellen in welcher die User und Loginzeiten abgelegt sind? Wie sind die voneinander abhängig(Foreign Key)?

Ich versuch mal einen Beispiel-SQL zu schreiben:
Code:
select usertabelle.id, sum(timestamptabelle.logouttimestamp - timestamptabelle.logintimestamp) from USERTABELLE usertabelle, TIMESTAMPTABELLE timestamptabelle 
where usertabelle.id = timestamptabelle.user_id 
and from_unixtime(timestamptabelle.logintimestamp) >= to_date('01.01.09', 'DD.MM.YY')
and from_unixtime(timestamptabelle.logintimestamp) <= to_date('31.01.09', 'DD.MM.YY')
and from_unixtime(timestamptabelle.logouttimestamp) <= to_date('31.01.09', 'DD.MM.YY');
Bin mir gerade nicht so sicher ob das funktionieren kann, aber es soll ja nur als Denkanstoß dienen.

odigo
 
Hallo,

danke für deine schnelle Antwort, aber meine Tabelle sieht im moment leider etwas anders aus. Um es für euch etwas transparenter zu machen erkläre ich euch kurz die Struktur:

account <- tabelle in der die Accounts gespeichert werden
account_log <- tabelle in der die Logs gespeichert werden
logtype <- tabelle in der die Logtypen definiert sind


account_log enthällt folgende spalten:

accountlogID <- ID des Eintrags
logtypeID <- ID des types (zb 1 für login, 2 für logout, 3 für irgendwas anderes, ...)
accountID <- ID des accounts
time <- timestamp

Die ganze Datenbank ist eine MySQL Datenbank. Ich hoffe die Infos reichen euch aus.
 
Ich behaupte jetzt mal anhand von den Informationen die du genannt hast daß dein vorhaben vom Datenmodell her nicht umzusetzen ist.
Ein User logt sich an einem Tag um 13 Uhr und um 14 Uhr ein. Die Logouts sind um 14.30 Uhr und 17 Uhr. Man kann jetzt nicht sagen zu welcher Logout zu welchem Login passt. Stichwort mehrere Browserfenster bzw. mehrere Tabs (oder ganz unterschiedliche Browser). Die Zuordnung von einem Login und einem Logout ist aber um eine Differenz bilden zu können unumgänglich. Oder hab ich da jetzt was falsch verstanden?

odigo
 
Original von Cyberm@ster
Lässt sich das nicht mit Sessions und / oder Cookies lösen?
Mit Cookies wohl eher nicht. Ein Firefox weiß nichts von einem Internet Explorer-Cookie. Mit Sessions würde das schon eher gehen, aber sowas implementiert man nicht einfach mal so schnell.

odigo
 
Ja schon. Damit könnte man einem User in Login und ein Logout zuordnen, da ja ein User zu einem Zeitpunkt nur eine Session haben kann, egal welcher Browser und wieviele Tabs.

Noch was als kleiner Denkanstoß/Rat: Wenn mans mit gigantischen SQL-Statements nicht so hat dann bietet jede Programmiersprache tolle Schleifen an in denen man natürlich wieder einfach Selects absetzen kann mit Daten aus dem vorigen Selects. So kommt man eigentlich auch recht einfach zu einem guten Ergebnis ohne riesige Selects mit 500 Joins und genau so vielen Unterselects schreiben zu müssen. Sowas vergisst man des öfteren ganz gerne.

odigo
 
Original von odigo
Ja schon. Damit könnte man einem User in Login und ein Logout zuordnen, da ja ein User zu einem Zeitpunkt nur eine Session haben kann, egal welcher Browser und wieviele Tabs.
unsinn. sessions im sinne der webprogrammierung sind nichts anderes als kurzzeitcookies.
 
Original von r@mi
sessions im sinne der webprogrammierung sind nichts anderes als kurzzeitcookies.

Ok, schande über mich. Das war natürlich Unsinn. Wenns so wäre wie ich gesagt habe wär ja Session-Hijacking möglich. Eher schlecht.
Ich musst auch gerade in einem Selbstest feststellen daß es durchaus auch möglich sein kann, daß ein User zu einem Zeitpunkt 2 oder mehrere Sessions hat. Bin gerade auf 2 Rechnern auf web.de eingeloggt ohne daß ich bei einem der beiden rausfliege. Hängt wohl davon ab welches Session-Konzept umgesetzt ist.

odigo
 
Wie wäre es mit dem Javascripteventhandler onClose, um das Schließen des Fensters ohne formelles Ausloggen abzufangen?
Ich weiß nur nicht, ob man mithilfe von Javascript was in eine Datenbank schreiben könnte. Auf jeden Fall könnte man aber die letzte Auslogzeit in einen Cookie schreiben und dessen Inhalt beim nächsten Einloggen in die Datenbank schreiben.
 
Mit JavaScript kannst du nicht direct in eine DB schreiben, du kannst aber beim onClose-Event eine URL mit Parameter aufrufen die via PHP-Script verarbeitet werden. Das geht aber nicht wenn JavaScript ausgeschaltet ist. (Cookies kann man eigentlich auch abschalten, ein Allheilmittel gibt es glaub ich nicht).
 
Ich würde es folgendermaßen machen:
Wenn ein User sich einloggt, dann beginnt eine "Session" (keine "php-session", das nenne ich nur so). Wenn er nun in den nächsten 15 minuten (oder ein beliebiges anderes Timeout) irgendetwas weiteres auf der Seite macht, dann wird seine Sessionlänge um diese Zeitspanne aktualisiert. Falls seine nächste Aktion aber erst nach diesem 15-minütigem Timeout geschieht, dann beginnt eine neue Session.
Kurz: eine Session geht solange, bis er sich ausloggt, es sei denn, er hat 15 minuten nichts gemacht, dann endet sie schon vorher.

Das ganze funktioniert natürlich nur, wenn das eine Seite ist, bei der man davon ausgehen kann, dass der user regelmäßig eine Eingabe tätigt, im Gegensatz zu z.B. einem Webradio etc.
 
Der Ansatz ist nicht schlecht, allerdings hat man dann ein Problem was für mein System leider nicht tragbar ist. Wenn der Benutzer nichts macht fliegt er raus und das führt unter umständen zu einem fatalen Datenverlust.
Eine weitere Idee, die mir grade kommt: Ich muss ebenfalls verhindern, dass sich 2 Leute mit einem Account einloggen. Meine spontane Idee dazu wäre jetzt die Session-ID in die Datenbank zu speichern und diese bei jeder Aktion/Login abzufragen, ob die übereinstimmt.

Wenn der Benutzer das Browserfenster schließt, oder ein anderer User sich mit dem selben Account anmelden will hat er eine andere Session-ID, dh der Zugang wird verwehrt. Liegt der letzte Zugriff allerdings 5-Minuten zurück kann er sich anmelden und die alte Session wird "beendet", dh ein neuer Eintrag wird geschrieben. Das bedeutet zwangsläufig, dass wenn ein Benutzer angemeldet ist er mindestens alle 4,99 minuten eine Aktion ausführen MUSS um angemeldet zu sein, bzw zu verhindern, dass ein anderer User ihm seinen Account "klaut". Das ist nicht besonders schlimm, da ich eh ein Aktuallisierungsscript aufrufen muss, dass jede Minute oder alle paar Sekunden eine Datenbankabfrage macht und eine Live-Statistik für den Benutzer aktuallisiert, dabei könnte ich den aktuellen Timestamp in die Datenbank schreiben und somit die letzte Aktion.

Wenn ich jetzt noch die Datenbank modifiziere, so dass ich quasi 2 Timestamp Spalten und eine Session-ID Spalte in den Eintrag einfüge, dann kann ich die Loginzeit und die Zeit der letzten Aktuallisierung speichern, womit ich meine genaue Berechnung bekomme.
Ich hoffe das ist soweit richtig, wenn nicht bitte melden :P

Einziges Problem was ich habe: Ich kenn mich 0 mit AJAX, etc aus und ich gehe stark davon aus, dass ich es für eine automatische Aktuallisierung brauche. Könnt ihr mir da ein bisschen unter die Arme greifen?

mfG Prophion
 
Eine weitere Idee, die mir grade kommt: Ich muss ebenfalls verhindern, dass sich 2 Leute mit einem Account einloggen. Meine spontane Idee dazu wäre jetzt die Session-ID in die Datenbank zu speichern und diese bei jeder Aktion/Login abzufragen, ob die übereinstimmt.

Würde es nicht reichen eine Boolean "logged_in" in die DB zu schreiben und ein Anmelden zu verwehren falls diese true ist? Das hätte auf jedenfall den Vorteil, dass du nur eine Abfrage bei der Anmeldung hättest anstatt für jede Aktion ein Query zu senden.
 
Das stimmt allerdings, der Query ist ja im Grunde genommen unnötig... wie kann ich denn einstellen, dass eine Session nach 5 Minuten gekillt wird, wenn keine Aktion erfolgt?
 
Zurück
Oben