Hallo,

Ik heb een database(online) waarin de tijd van het inloggen wordt opgenomen.
Als de user uitlogd wordt dit record verwijderd , maar sommige users loggen niet uit , ze verlaten gewoon zonder uitloggen, dus het record blijft bestaan.
Nu wil ik zelf het record verwijderen door te gaan kijken naar de inlogtijd en deze vergelijken met de huidge tijd - 2uur.

Als de inlogtijd kleiner is dan de huidige tijd -2 uur mag het record verwijderd worden.

Ik slaag er niet in deze tijden te kunnen vergelijken , eook niet om de tabel af te lopen.

Wie kan mij hiermee helpen AUB
Als je vrij nauwkeurig wilt kunnen bepalen of een gebruiker je site nog open heeft, ontkom je er niet aan om een soort "call home"-functie in te bouwen, oftewel een script dat regelmatig een seintje geeft naar de website dat de pagina nog open staat.

Je kan er overigens niet uit afleiden of de gebruiker écht iets aan het doen is, of dat hij de pagina heeft geopend en vervolgens de hond uit is gaan laten. Alleen wanneer daadwerkelijk een pagina wordt geladen is dat een redelijk goede aanwijzing dat de gebruiker actief is. Maar met een keep-alive-signaal kun je in ieder geval zien dat de pagina nog zichtbaar is op het scherm.

Hiertoe zou je op elke pagina van je site een iframe kunnen opnemen dat een bestandje keepalive.php (of hoe je het dan ook wilt noemen) opent. Dat iframe kun je met CSS (display:none) verbergen.

In keepalive.php bepaal je aan de hand van de sessiegegevens wat het userid is en update je het record waarin wordt bijgehouden dat de gebruiker online is. Vervolgens genereer je een (optisch lege) HTML-pagina met daarin een stukje javascript. Iets als:

<?php
   # Bepaal het userid en voer vervolgens een SQL-query uit om aan te geven dat de gebruiker nog actief is:
   # UPDATE heartbeats SET last_active = NOW() WHERE userid = ?
?><html><title></title><head>
<script>
function keepalive()
{
   if (document.visibilityState != 'hidden') {
      location.reload();
   }
}
setInterval(keepalive,120000);
</script>
</head><body></body></html>

Door de setInterval() wordt de functie keepalive() elke 2 minuten aangeroepen. Als de visibilityState van de pagina niet 'hidden' is, wordt de pagina herladen. Is de gebruiker ondertussen naar een andere tab gegaan, of heeft hij zijn browser geminimaliseerd, dan is de state wel 'hidden' en kijkt het script twee minuten later nog eens of de gebruiker weer is teruggekomen.

Als je niet wilt dat een gebruiker die is weggezapt automatisch weer online komt, zou je de setInterval() kunnen veranderen in een setTimeout(); de keepalive-functie wordt dan slechts eenmaal aangeroepen. Is de webpagina zichtbaar/actief dan wordt keepalive.php in het iframe herladen, waardoor de setTimeout opnieuw wordt ingesteld. Het enige verschil tussen setTimeout en setInterval is dus dat in het laatste geval de gebruiker weer automatisch online komt als hij teruggaat naar de browser-tab met jouw website.

In de code voor je website kun je vervolgens bepalen welke gebruikers online zijn door te kijken naar alle gebruikers waarvan de last_active-timestamp niet ouder is dan 2 minuten. Voor de zekerheid moet je misschien een minuutje extra erbij nemen.


SELECT userid, timestampdiff(minute, last_active, now()) as alive
from heartbeats
where last_active > now() - interval 10 minute


Op je website kun je nu alle gebruikers met alive < 3 de status 'online' geven en iedereen met alive >= 3 de status 'recent online' of iets dergelijks.

<disclaimer>
Ik heb dit net even uit de losse pols zitten tikken dus het kan zijn dat het niet, of niet in alle situaties, perfect werkt.
</disclaimer>

Reageren