Nach 30min Inaktivität automatisch eine bestimmte Datei öffnen

keiplan

Mitglied
Hi!

Ich habe ein kleines "Forum" geschrieben und hänge nun an der user-online-Funktion.
Ich speicher beim Login in der Spalte 'online' den Wert '1' und beim Logout den Wert '0'. Wenn sich jmd aber nicht ausloggt, sondern einfach so das Fenster schließt, steht er permanent als online in der Tabelle. Wie kann ich eine Inaktivitäts-Kontrolle o.ä. einbauen? Oder was macht man in diesem Fall am besten?

Vielen Dank im voraus
mfg, plan
 
Im Prinzip sieht das so aus: Jedesmal, wenn diese Online-Anzeige angezeigt werden soll, überprüft ein PHP-Script, wann derjenige User zuletzt online war. Wenn dieser Zeitpunkt länger als 5 (oder was auch immer) Minuten zurückliegt, gilt er automatisch als offline.
 
Auf jeden fall brauchst du immer ne zeit in der db, wann das letzte mal was passiert ist..
Und dann entweder per conjob oder per script immer die raushauen wo aktuelle zeit - letzte aktiviät > 30min ist.
 
Eine bestimmte Datei wirst Du zu einer bestimmten Zeit nur über CRON-Jobs öffnen können.
Auf den meisten Webservern steht Dir das aber nicht zur Verfügung.
Auch dass ausführen zu einer sich ändernden Zeit (+30min) wird es wohl schwierig.
Also muss eine andere Lösung her:
Bei jedem Aufruf Deiner Seite bindest Du ein PHP-Skript ein, was den letzten Besuch aller User überprüft.
Ist der letzte Besuch eines Users mehr als 30 min, her löscht Du ihn aus Deiner Online-Liste.
Da in der zwischenzeit ja kein anderer die Seite aufruft (Du bindest das Skript schließlich bei jedem Aufruf ein) sieht auch kein User in der Online-Liste User, die länger als 30 min nichts gemacht haben.
Ohne Garantie könnte ein SQL-Statement dazu so aussehen:
Code:
UPDATE users SET users.online=0 WHERE TIME_TO_SEC(TIMEDIFF(NOW(),users.lastvisit)) > 1800;
 
Ok, doch nochmal eine Frage:

Warum geht das so nicht?
-> lastvisit ist ein timestamp...

PHP:
<table border="1" cellspacing="0" cellpadding="3" class="blue" bordercolorlight="#CCCCCC" bordercolordark="#FFFFFF">
	<tr class="fett">
		<td>Benutzer online:</td>
	</tr>
         <tr>
		<td colspan="8"></td>
	</tr>
	     <?
	     include ("login/config/db.php");
	     $query = "SELECT * FROM zugriff WHERE online=1 ORDER BY id ASC";
	     $result = mysql_query($query);
              ?>
	<tr>
		<td><? // Schleife um den Inhalt der Tabelle auszugeben
	     	       while ($line = mysql_fetch_array($result)) {
                        echo $line['name']." "; }
                     ?>
                 </td>
	</tr>
	     <?
              // Nach bestimmter Zeit online auf 0 setzen!
              mysql_query("UPDATE zugriff SET online=0 WHERE TIME_TO_SEC(TIMEDIFF(NOW(),lastvisit)) > 1800;");

	     mysql_free_result($result);
	     mysql_close();
	     ?>
</table>
 
Gib mal nach dem query
PHP:
echo mysql_error();
aus und zeig uns die Fehlermeldung.
Vermutlich stimmt das Query nicht.
Ich habe es mir hier im Editor als Idee aus den Fingern gesogen.

Was genau funktioniert denn nicht?
Bist Du Dir sicher, dass die Daten so, wie sie sollen in der DB stehen?

Ich würde das update vor dem auslesen machen, damit Du die aktiven User erst bereinigst und dann ausgibst.

TIMEDIFF gibt es ab MySQL 4.1.1, vielleicht ist Dein MySQL ja älter?

EDIT:
Noch was: Statt "SELECT * ..." würde ich im oberen Query "SELECT name ..." machen, das spart Ressourcen, da Du ja nur den Namen ausgibst.
 
Zuletzt bearbeitet:
Einen Fehler bringt der gar nicht... Und die Daten stehen auch richtig in der DB :/
Das mit dem Ressourcen sparen stimmt, danke (Dumm von mir).
 
Zurück