Offline setzen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktion
anzahl
beitrag
count
date
eintrag
gast
gel
insert
login
minute
registrierte
result
session
set
tabelle
test
update
user
username
-
Hi,
ich bin gerade dabei ein eigenes Forum zuprogrammieren was wauch sehr gut klappt. Ich habe nur jetzt ein Problem. Ich habe eine Tabelle, o jeder User eingeschrieben wird, der sich einloggt und dann ausgeben wird, wenn er online ist. Wenn er sich ausloggt dann wird sein Eintrag gel?scht. Es gibt ja aber auch User, die es nicht machen, die einfach das Browser Fenster schlie?en und dann weg sind.
Jetzt will ich einen Script schreiben, der nach 20 Minuten alle User die seit 20 Minuten nichts mehr geschrieben haben oder ebsser gesagt inaktiv waren aus der DB gel?scht werden.
Jetzt ist nur meine Frage, wie mein Script dazu aussehen muss, damit er die jeweiliegn User l?scht?
Danke f?r Hilfe... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
ganz einfach, du speichert in der tabele den namen und den timestemp von der letzten action.
beim aufruf jeder seite ?berpr?fst du die timestamps in der tabele
alle die l?nger als xy minuten inativ waren/sind werden gel?scht.
kleines beispiel:
//das ist die tabelle
username,lastact
doro,1132566224
lilly,1132565650
kitty,1132565070
//als erstes wird der timestemp vom activen user upgedatet: $user = $_SESSION['user']; $time = time() + (20*60); //jetzt plus 20 minuten $sql = sprintf("UPDATE tabelle SET lastact = %d WHERE username = '%s' LIMIT 1", $time, $user); mysql_query($sql); // danach werden die inactiven gel?scht: $sql = sprintf("DELETE FROM tabelle WHERE lastact < %d", time()); //l?schen wenn lastact kleiner als time, da wir bei lastact 20 min dazugerechnet haben. mysql_query($sql);
-
bei jeder Aktion eines Users schreibst du einfach einen Timesstamp in die Tabelle.
Und jedesmal, wenn jemand sich die User-online Tabelle anschaut, dann werden alle Datens?tze gel?scht, die einen Veralteteten Timesstamp haben.
Also, login
-->INSERT INTO onlinelist(user,zeit,aktion)VALUES($user_id,date(U),"loggt sich ein");
Irgendeine Aktion im Forum
-->Update onlinelist SET zeit=date(U), SET aktion=" schaut sich gerade $threadid an"
ausloggen
-->Delete FROM onlinelist WHERE user=$user_id
-->Update users SET session=0 //oder wie du das auch immer machen magst mit Sessions
inaktiv-ausloggen
-->SELECT user FROM onlinelist WHERE zeit+(3600*20)>date(U)
mit den Ergebnissen der Queries-->DELETE FROM onlinelist WHERE user_id=$user_kick[0] OR user_id=$user_kick[1] ...
-->UPDATE users SET session=0 WHERE user_id=$user_kick[0] OR user_id=$user_kick[1] ...
Ich hoffe das ist in etwa so klar. Habe es nicht ausprobiert, sollte dir aber einen Ansatz geben, wie sowas funzt. -
@bladehunter..
du h?ttest es testen sollen, denn da sind einige fehler drin:
irgendeine Aktion im Forum
-->Update onlinelist SET zeit=date(U), SET aktion=" schaut sich gerade $threadid an"
cool... hiernach schuen sich ALLE user grade thread xy an da fehlt das WHERE user = $user_id
Update users SET session=0
hier werden wieder alle user auf offline gesetzt^^ wieder fehlt das WHERE user = $user_id
au?erdem eine schlechte idee, da ich vllt 20 min nichts mache, aber trotzdem mich nicht wieder einloggen m?chte (als benutzer)
eingeloggt sein und activ sein sind imo 2 verschiedene paar schuhe.
SELECT user FROM onlinelist WHERE zeit+(3600*20)>date(U)
wow 20 stunden??? ?hm ich w?rd sagen dir ist da ein denkfehler unterlaufen 60 secunden * 60 minuten sind 1 stunde(3600 sec) mal 20 sind 20 stunden... und dann noch wenn zeit + 20 stunden gr??er als jetzt das trifft dann auf alle zu, au?er es war l?nger als 20 stunden keiner auf der seite, und dann beiben die inactiven als active da, und die activen werden gel?scht^^
also SELECT user FROM onlinelist WHERE zeit+(60*20) < date(U) -
[b]$sql = sprintf("UPDATE tabelle SET lastact = %d WHERE username = '%s' LIMIT 1", $time, $user); mysql_query($sql);[/b]
Wof?r benutzt du hier genau das LIMIT 1 -
n tick von mir. eigentlich sollten die namen nur einmal in der tabelle vor kommen... da ich aber nur eine spalte updaten will gebe ich automatisch ein LIMIT 1 mit...
psyhologisch habe ich das gef?hl es ist schneller^^ -
Achso alles klar.
Dann noch eine Frage, wie kann ich es machen mit G?sten?
Kann ich dann auch sagen jeder der die Seite Aufruft wird als Gast gespeichert.
Wenn er sich einloggt wird er aus der DB gel?scht wo er als Gast eingetragen ist.
Und sonst wird er auch nach 20 minuten gel?scht wenn er nichts gemacht hat?
Geht es sowas? -
du machst eine zweite tabelle f?r g?ste
und benutzt session.
am anfang eine session starten werte vergeben (das wei?t du alles bestimmt)
du vergibst jeden gast eine unique_id
gespeichert wird der time stamp + unique_id in eine gast-tabelle
wenn der user sich einlogt wird er in die 'richtige' online anzeige gesetzt + timestamp anhand der unique_id wir der gast-eintrag gel?scht.
da g?ste keinen namen haben reicht ja eine anzeige a la es sind xy G?ste online aus.
braucht du da ein genaues beispiel?
-
Nein danke das reicht vollkommen
-
Sio das habe ich benutzt f?r die G?ste:
<?php $sql = "SELECT COUNT(*) as Anzahl FROM online WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; $result = mysql_query($sql) OR die(mysql_error()); $row = mysql_fetch_assoc($result); if($row['Anzahl']) { // Nur Datum Updaten $sql = "UPDATE online SET Datum = NOW() WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; mysql_query($sql) OR die(mysql_error()); } else { // Neuer eintra $sql = "INSERT INTO online (IP, Datum) VALUES ('".$_SERVER['REMOTE_ADDR']."', NOW())"; mysql_query($sql) OR die(mysql_error()); } // alte Datens?tze l?schen $sql = "DELETE FROM online WHERE DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum"; mysql_query($sql) OR die(mysql_error()); // Anzahl Ausgeben $sql = "SELECT COUNT(*) as Anzahl FROM online"; $result = mysql_query($sql) OR die(mysql_error()); $row = mysql_fetch_assoc($result); echo "User Online: ".$row['Anzahl']."<br />"; ?>
Nur wie kann ich da jetzt noch das einbauen, das f?r die Use, ich meine auch so das die Usernamen dann auch ausgeben werden?
Beitrag ge?ndert am 21.11.2005 16:32 von newwarrior -
// Anzahl Ausgeben $sql = "SELECT name FROM online"; $result = mysql_query($sql) OR die(mysql_error()); $gesamt = mysql_num_rows($result); $gaeste = 0; $namen = array(); while( $row = mysql_fetch_assoc($result)) { if($row['name'] == 'Gast') { $gaeste++; continue; } else { $namen[] = $row['name']; } } $name = implode(" ", $namen); echo "<p>User Online: $gesamt davon $gaeste Gäste <br />$name</p>"
in der annahme, dass g?ste und angemeldete in der selben tabelle stehen und geste Gast hei?en^^
-
So ok ?berarbeitet:
<?php if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "") echo $name = $_SESSION["user_username"]; else $name = "Gast"; $sql = "SELECT COUNT(*) as Anzahl FROM online WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; $result = mysql_query($sql) OR die(mysql_error()); $row = mysql_fetch_assoc($result); if($row['Anzahl']) { // Nur Datum Updaten $sql = "UPDATE online SET Datum = NOW() WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; mysql_query($sql) OR die(mysql_error()); } else { // Neuer eintra $sql = "INSERT INTO online (IP, Datum, name) VALUES ('".$_SERVER['REMOTE_ADDR']."', NOW()), '".$name."'"; mysql_query($sql) OR die(mysql_error()); } // alte Datens?tze l?schen $sql = "DELETE FROM online WHERE DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum"; mysql_query($sql) OR die(mysql_error()); // Anzahl Ausgeben $sql = "SELECT name FROM online"; $result = mysql_query($sql) OR die(mysql_error()); $gesamt = mysql_num_rows($result); $gaeste = 0; $namen = array(); while( $row = mysql_fetch_assoc($result)) { if($row['name'] == 'Gast') { $gaeste++; continue; } else { $namen[] = $row['name']; } } $name = implode(" ", $namen); echo "<p>User Online: $gesamt davon $gaeste G?ste <br />$name</p>" ?>
Ok und das wurde ausgeben, nur leider wird es falsch ausgeben. Ich habe mich nicht eingelogt, Also m?sste 1 Gast uasgeben w?rden. W?rd es aber nicht.
User Online: 1 davon 0 G?ste -
} else { // Neuer eintra $sql = "INSERT INTO online (IP, Datum, name) VALUES ('".$_SERVER['REMOTE_ADDR']."', NOW(), '".$name."')"; mysql_query($sql) OR die(mysql_error()); }
hier h?tte er ja meckern m?ssen, da du hinter now() die ) gelassen hast anstatt sie hinter $name zu schreiben) ... gib mal bitte den link, damit ich mir die ausgabe mal angucken kann -
habt das ge?ndert klappt immer noch nicht hier mal duie Seite:
http://newwarrior.milten.lima-city.de/forum/forum.php -
danke klappt doch
-
Naja zu F?rh gefreut. Ich habe jetzt meine Login fertig.
hier k?nnt ihr es testen: Password und Login sind test
http://newwarrior.milten.lima-city.de/forum/forum.php
Und jetzt kommen die Fehler:
http://newwarrior.milten.lima-city.de/Unbenannt.JPG
1. Obwohl ich als User angemeldet bin, werde ich auch als Gast gez?hlt.
2. Selbst wenn ich ausgelogt bin, steht der bei den Namen immer noch Gast, obwohl er da nichts zusuchen hat.
3. Wenn ein User sich einlogt wird eir zweimal ausgeben, einmal ?ber dem Div Bereich und einmal im Div Bereich.
Hier mein Code:
<?php if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "") echo $name = $_SESSION["user_username"]; else $name = 'Gast'; $sql = "SELECT COUNT(*) as Anzahl FROM online WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; $result = mysql_query($sql) OR die(mysql_error()); $row = mysql_fetch_assoc($result); if($row['Anzahl']) { // Nur Datum Updaten $sql = "UPDATE online SET Datum = NOW() WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; mysql_query($sql) OR die(mysql_error()); } else { $sql = "INSERT INTO online (IP, Datum, name) VALUES ('".$_SERVER['REMOTE_ADDR']."', NOW(), '".$name."')"; mysql_query($sql) OR die(mysql_error()); } // alte Datens?tze l?schen $sql = "DELETE FROM online WHERE DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum"; mysql_query($sql) OR die(mysql_error()); // Anzahl Ausgeben $sql = "SELECT name FROM online"; $result = mysql_query($sql) OR die(mysql_error()); $gesamt = mysql_num_rows($result); $gaeste = 0; $namen = array(); while( $row = mysql_fetch_assoc($result)) { if($row['name'] == 'Gast') { $gaeste++; continue; } else { $namen[] = $row['name']; } } echo "<div id=\"online\">Insgesamt <b><i>$gesamt</i></b> Person(en) Online<br><br>G?ste: <b><i>$gaeste</i></b><br>Registrierte User : <b>$name</b></div>" ?>
Beitrag ge?ndert am 22.11.2005 16:26 von newwarrior -
if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "") echo $name = $_SESSION["user_username"];
hier gibst du dan namenb auch aus, also brauchst du dich nicht wundern, wenn er auch ?berm div ausgegeben wird.
wie du die l?schung des gastes vornimmst k?nnen wir nicht sehen... dazu m?sstest du dein login script zeigen. vo du den user anmeldest und den gast eintrag l?scht.
das, wenn kein registrierter user angemeldet ist dort Gast steht, ist meine schuld. ich habe nicht dran gedacht, das die varable name ja schon f?r den namen verwendet wird...
nimm da einfach users:
$users = implode(" ",$namen);
und im echo (unten bei der namens ausgabe) auch $users schreiben..
Beitrag ge?ndert am 22.11.2005 23:21 von kirschbluete -
So ich habe das jetzt ge?ndert. Mir wird jetzt der Name nicht mehr ?ber dem Div Bereich angezeigt. Aber wenn ich mich einlogge steht danach auch nichts bei registriete User.
Au?erdem ist mir aufgefallen kann mein Script wenn ?berhaupt nur 1 Namen anzeigen.
Habe mich einmal ?ber den IE als test und ?ber den Firefox als Admin eingeloggt und es wird beim IE nur der test und beim Firefos nur der Admin angezeigt. -
// Anzahl Ausgeben $sql = "SELECT name FROM online"; $result = mysql_query($sql) OR die(mysql_error()); $gesamt = mysql_num_rows($result); $gaeste = 0; $namen = array(); while( $row = mysql_fetch_assoc($result)) { if($row['name'] == 'Gast') { $gaeste++; continue; } else { $namen[] = $row['name']; } } $namen = implode(" ", $namen);//wichtig!! echo "<div id=\"online\">Insgesamt <b><i>$gesamt</i></b> Person(en) Online<br><br>G?ste: <b><i>$gaeste</i></b> <br>Registrierte User : <b>$namen</b></div>"
das, wenn kein registrierter user angemeldet ist dort Gast steht, ist meine schuld. ich habe nicht dran gedacht, das die varable name ja schon f?r den namen verwendet wird...
hab da jetzt implode wieder mit ins spiel gebracht. das ist wichtig! denn die namen die nicht gleich Gast sind werden im array $namen gespeichert und dann durch implode zum string gemacht.
nimm da einfach users:
$users = implode(" ",$namen);
und im echo (unten bei der namens ausgabe) auch $users schreiben.. -
also ich habe es ge?ndert:
<?php if(isset($_SESSION["user_username"]) && $_SESSION["user_password"] != "")$name = $_SESSION["user_username"]; else $name = 'Gast'; $sql = "SELECT COUNT(*) as Anzahl FROM online WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; $result = mysql_query($sql) OR die(mysql_error()); $row = mysql_fetch_assoc($result); if($row['Anzahl']) { // Nur Datum Updaten $sql = "UPDATE online SET Datum = NOW() WHERE IP = '".$_SERVER['REMOTE_ADDR']."'"; mysql_query($sql) OR die(mysql_error()); } else { $sql = "INSERT INTO online (IP, Datum, name) VALUES ('".$_SERVER['REMOTE_ADDR']."', NOW(), '".$name."')"; mysql_query($sql) OR die(mysql_error()); } // alte Datens?tze l?schen $sql = "DELETE FROM online WHERE DATE_SUB(NOW(), INTERVAL 1 MINUTE) > Datum"; mysql_query($sql) OR die(mysql_error()); // Anzahl Ausgeben $sql = "SELECT name FROM online"; $result = mysql_query($sql) OR die(mysql_error()); $gesamt = mysql_num_rows($result); $gaeste = 0; $namen = array(); while( $row = mysql_fetch_assoc($result)) { if($row['name'] == 'Gast') { $gaeste++; continue; } else { $namen[] = $row['name']; } } $namen = implode(" ", $namen);//wichtig!! echo "<div id=\"online\">Insgesamt <b><i>$gesamt</i></b> Person(en) Online<br><br>G?ste: <b><i>$gaeste</i></b> <br>Registrierte User : <b>$namen</b></div>" ?>
Aber jetzt werden die Registrierten User nicht mehr angezeigt wenn sie sich eingeloggt haben.
Achja hier meine Login Datei, was muss ich da jetzt ?ndern, das aus dem gast der User wird, wenn er sich einloggt:
<?php session_start (); error_reporting(E_ALL); include ("../function/verbindung.php"); $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sql ="SELECT id, username, password, admin FROM user WHERE username = '". $username ."' AND password = '". $password ."'"; $result = mysql_query ($sql) or die(mysql_error()); if (mysql_num_rows ($result) > 0) { $data = mysql_fetch_array ($result); $_SESSION["user_id"] = $data["id"]; $_SESSION["user_username"] = $data["username"]; $_SESSION["user_password"] = $data["password"]; $_SESSION["user_admin"] = $data["admin"]; header ("Location: ../../forum.php?login=yes"); } else { header ("Location: ../../forum.php?login=no"); } ?>
Danke -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage