| (Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI... |
Diskussion: User Loginzeit berechnen im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hallo, ich habe mal wieder ein Problem ich hoffe ihr könnt mir helfen. Ich habe in einer Datenbank mehrere ...
![]() |
| | #1 (permalink) |
| Anzeige 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 | |
| | |
| | #2 (permalink) |
| Senior Member | 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'); odigo
__________________ [HaBo] @ Facebook - Gefällt mir! |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Themenstarter | 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. |
| | |
| | #4 (permalink) |
| Senior Member | 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
__________________ [HaBo] @ Facebook - Gefällt mir! |
| | |
| | #5 (permalink) |
| Senior Member Registriert seit: 27.06.04 ![]() Likes: 0 | Lässt sich das nicht mit Sessions und / oder Cookies lösen? |
| | |
| | #6 (permalink) | |
| Senior Member | Zitat:
odigo
__________________ [HaBo] @ Facebook - Gefällt mir! | |
| | |
| | #7 (permalink) |
| Senior Member Registriert seit: 27.06.04 ![]() Likes: 0 | Damit wüsste man aber welches Logout zu welchem Login gehört oder nicht? |
| | |
| | #8 (permalink) |
| Senior Member | 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
__________________ [HaBo] @ Facebook - Gefällt mir! |
| | |
| | #9 (permalink) | |
| Zitat:
__________________ | ||
| | |
| | #10 (permalink) | |
| Senior Member | Zitat:
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
__________________ [HaBo] @ Facebook - Gefällt mir! | |
| | |
| | #11 (permalink) |
| 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. | |
| | |
| | #12 (permalink) |
| Senior Member Registriert seit: 27.06.04 ![]() Likes: 0 | 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). |
| | |
| | #13 (permalink) |
| Senior Member | 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. |
| | |
| | #14 (permalink) |
| Themenstarter | 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 ![]() 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 |
| | |
| | #15 (permalink) | |
| Senior Member Registriert seit: 27.06.04 ![]() Likes: 0 | Zitat:
| |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Tage berechnen | minzel | Programmieraufgaben | 37 | 10.10.11 16:11 |
| Stream Last berechnen | Easyrider | Network · LAN, WAN, Firewalls | 1 | 27.03.09 15:21 |
| a^-1 modulo m Wie berechnen? | elite-noob | Science & Fiction | 3 | 04.02.09 17:23 |
| a^-1 modulo m Wie berechnen? | elite-noob | Off topic-Zone | 3 | 04.02.09 17:23 |
| Festplattenkapazität berechnen | BlackMarvel | Off topic-Zone | 4 | 16.07.06 23:02 |