Hallo, ik ben bezig met een chat systeem nou wil ik zeg maar zodra de user de pagina verlaat dat er in de status offline komt te staan nu werkt online wel maar hij gaat niet offline,


<?php
	$user_activity = '<span style="color:red">Offline</span>';
			$stored_activity = $value['last_activity'];
			if (!is_null($stored_activity)) {
				$user_last_activity = new DateTime($stored_activity);
				$current_time = new DateTime("now");

				$interval = $current_time->getTimestamp() - $user_last_activity->getTimestamp();
				$diff = abs(strtotime($value['last_activity']) - strtotime($current_time));

				if ($interval < 1) {
					$user_activity = '<span class="badge badge-success" style="font-size: 15px; font-weight: lighter;">Online</span>';
				} else {
					$user_activity = '<span class="badge badge-success" style="font-size: 15px; font-weight: lighter;">Online</span>';
				}
			} else if (is_null($stored_activity)) {
				$user_activity = '<span style="color:orange">N/A (Refresh)</span>';
			}

			?>
			<div class="grid-container entry <?php if ($value["viewed"] == 'false') { echo 'download'; } ?>">
				<div class="grid-item data" style="color: black !important;"><?php echo $user_activity; ?></div>
				<div class="grid-item status"><?php echo $value['lastname']; ?></div>
dus de fout licht hier aan

$interval = $current_time->getTimestamp() - $user_last_activity->getTimestamp();
Die berekening klopt prima. Maar je moet goed kijken naar de waarde van $interval, en daarna het juiste ermee controleren.

Lees ook even mijn vorige reacties goed door, en ook mijn tip die ik van harte kan aanbevelen. Langdurige tijd achter elkaar programmeren en vermoeidheid leidt tot tunnelvisie. Rust is de oplossing om verder te gaan.
ik zal morgen wel naar verder kijken want ik snap het even niet meer
Even lekker uitrusten.
Lekker slapen
Morgen met fris hoofd weer even doorlezen

En dan denk je vast van: "Euréka! Zo simpel is het!"

<?php
 $date_now = date("Y-m-d");
if ($date_now > '2023-14-03') {
    echo 'online';
}else{
    echo 'offline';
}
?>


je bedoelt zo iets ?
Lol! Stop gewoon joh!
Of blijf lekker doorgokken tot 05:00 uur! :-P

En nee, je hoeft echt niet je hele code te verbouwen. Het is enkel je if()'je en de check daarin.
Ik hou er wel van om dat soort bepalingen direct in de query te doen:


SELECT last_activity > NOW() - INTERVAL 5 MINUTE AS onoffline, * FROM customers


Je krijgt dan een extra "kolom" genaamd onoffline die de waarde 0 of 1 bevat, al naar gelang of de laatste activiteit meer of minder dan 5 minuten geleden was.
Naar believen mag je die 5 minuten natuurlijk ook aanpassen naar een ander interval, desnoods 1 HOUR, 30 SECOND etc.
@Ivo, hoe zet jij bij inactiviteit de status automatisch op offline? Aan de hand van de datum kan je al genoeg uitrekenen.


Een extra alias-veld dus.. :p

Aad kwam ook met beforeunload aan. Die wordt dan getriggerd als iemand de browser afsluit. Maar wat nu als de browser crasht of de spanning van je device wegvalt die vervolgens direct uitgaat? Dan blijf je volgens mij op online staan.

30 seconden klinkt erg accuraat. Maar onthoud wel dat de browser niet continu de laatste activiteitsdatum door kan geven. Na de volgende hit zal je gemarkeerd worden als niet-actief tot de volgende hit plaatsvind. Een time-out van 3 a 5 minuten is wenselijker.
Ik doe technisch gezien hetzelfde als TO wil doen in PHP.

Ik vergelijk de laatste activiteitslogging met NU.
Alleen doe ik dat in de query, waar TO het in PHP poogt te doen door via een omweg de epoch te vergelijken van de laatste activiteit en die van NU.

Ik denk dat de query-oplossing cleaner is, omdat daar niet allerlei omrekeningen bij betrokken zijn. En anders zou ik het ook met een datediff doen ipv het naar seconden omrekenen.

Je kan het ook inderdaad via de database doen. Het zal misschien een paar nano'tjes schelen.

Reageren