DB Abfrage. Username kriegen
Robin Salamon
- php
0 Tom
Ich möchte eine Logdatei für mein Clanforum erstellen. Beim Login wird auch alles übertragen. Nun will ich aber auch wissen, wann sich der User ausgeloggt hat. Kann mir jemand sagen, wie ich die DB Abfrage machen muss, und wie ich dann weiter verfahre?
Bin noch ein totaler Anfänger in Sachen PHP.
Code von logout.php (nicht viel, daher auch nicht angehangen - hoffe das ist ok)
<?php
$filename="logout.php";
require ("./global.php");
/* Abfrage wenn User AFK nach Logout AFK automatisch aufheben */
$check = $db->query_first("SELECT userid FROM bb".$n."_shoutbox_afk WHERE userid='".$wbbuserdata['userid']."'");
if($check['userid'] != "") {
$db->query("DELETE FROM bb".$n."_shoutbox_afk WHERE userid='".$check['userid']."'");
$db->query("DELETE FROM bb".$n."_shoutbox_messages WHERE userid='".$check['userid']."' AND befehl='2'");
}
/* ABFRAGE ENDE */
bbcookie("wbb_userid","",0);
bbcookie("wbb_userpassword","",0);
bbcookie("boardpasswords","",0);
bbcookie("hidecats","",0);
bbcookie("boardvisit","",0);
bbcookie("threadvisit","",0);
bbcookie("postvisit","",0);
// Logdatei Anfang
$Tag = getdate();
$datei = fopen("test.txt", "a");
$USERNAME = ' ';
$DaTum = date("d.m.Y",mktime(0, 0, 0, date("m"), date ("d"), date("Y")));
$Uhrzeit = date("H:i");
$inhalt = "Member \"".$USERNAME."\" hat sich am ".$DaTum." (".$Tag[weekday].") um ".$Uhrzeit." abgemeldet";
fwrite($datei, "$inhalt.\r\n");
fclose($datei);
// Logdatei Ende
$db->query("UPDATE bb".$n."_sessions SET userid = '0' WHERE hash = '$sid'");
eval("redirect(\"".$tpl->get("redirect_logout")."\",\"index.php?sid=$session[hash]\");");
?>
'USERNAME' ist mit Absicht nicht eingetragen. Wie gesagt, da komme ich nicht weiter.
Wär lieb, wenn mir jemand auf die Sprünge helfen könnte.
lG Nino
// Edit: Mir ist klar, dass in dem Teil der Logdatei ein paar unnötige Variablen sind, bzw. ein paar Sachen umständlich gemacht sind.
Das korregiere ich noch. Aber das aktuelle Problem mit dem Usernamen ist grade mit höherer Priorität vertreten..^^
Hello,
wie wäre es mit einer aussagefähigen Dokumentation des Codes?
Generell zum Thema "Logout":
Da es bei HTTP kein "Login" gibt, auch wenn das immer so genannt wird, kann es auch kein "Logout" geben. Es gibt nur eine Authentifizierung. Um innerhalb einer Session entscheiden zu können, ob der User zu gewissen Handlungen berechtigt ist, erhält er einen Key. Dieser sollte nur eine bestimmte Lebensdauer haben. Die Lebensdauer ist durch erneute Handlungen nachtriggerbar.
HTTP ist aber als verbindungs- und zustandsloses Protokoll gebaut und so kann man zwischen den Requests nicht wissen, ob der User noch vor dem Client lauert.
Die meisten Systeme verzichten sogar auf die Nachtriggerung des Keys, und verlassen sich einfach auf die automatische Nachtriggerung der Session. Da der Key meistens in der Sessiondatei eingetragen wird, verfällt der Key automatisch mit, wenn die Session endet und die Datei gelöscht wird. Das ist aber nicht unbedingt die richtige Vorgehensweise.
Wenn Du nun die Gültigkeit des Keys bei jedem Besuch (jedem Click) über Deine Datenbank überprüfst, kannst Du dort auch den letzen "Clickzeitpunkt" eintragen. Wenn die Zeit vom vorigen zum nächsten zu lang wird (das bestimmst dann Du), wird der Schlüssel ungültig und der User ist automatisch "ausgeloggt" Diesen Zeitpunkt kannst Du Dir dann in Deiner Statistiktabelle merken.
Da der Schlüsselverfall irgendwann zwischen dem letzten gültigen Klick und dem ersten ungüligen gelegen hat (nämlich t1 + dt, dt ist die von Dir festgelegte Nachtriggerzeit), kannst Du Dir überlegen, ob Du diesen Zeitpunkt als "Logout"-Zeitpunkt nehmen willst.
Wenn der User sich gezielt abmeldet, indem er in einem Request darum bittet, hast Du den Zeitpunkt exakt.
Zu überlegen ist nun noch die dritte Möglichkeit: Er hört einfach auf zu surfen und lässt seinen Schlüssel verfallen. Wie willst Du das feststellen? Du müsstest Dir also Deine "Logintabelle" in der Datenbank alle paar Minuten nach verfallenen Schlüsseln durchsehen, diese Datensätze dann in Deine Statistik übertragen und den Satz als verarbeitet markieren. Wenn der User sich wieder anmeldet, wird die Markierung wieder entfernt, usw.
Oder aber Du verzichtest einfach eine Weile auf den letzten Datensatz in Deiner Statistik und lässt ihn erzeugen, wenn der User sich das nächste Mal wieder anmeldet. Der "Lastclick" steht ja noch drin in der Tabelle und bevor der dann durch den aktuellen timestamp ausgetauscht wird, kannst Du ihn übertragen.
Ich hoffe, die Überlegungen helfen Dir ein bisschen weiter.
Liebe Grüße
Tom vom Berg