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>
Ik zal dan gewoon zo moeten doen

$interval = date_diff($date1, $date2)

Date 1 de tijd van de nu en date2 checken wat de tijd in last_activity staat
Zou ook kunnen, al zou ik wel voor fatsoenlijke variabelen kiezen. 1 en 2 zegt echt niks, en is een voorbode voor bugs in je script. Maar waarom date_diff() gebruiken terwijl je al DateTime als class gebruikt?

Anyway: Je hebt twee verschillende tijden: huidige tijd, en de tijd van het laatste bezoek.
Dus dan heb je dus deze variabelen:

$current_time->getTimestamp() en $user_last_activity->getTimestamp()
het spreekt wel voor sich wat ze aan boord hebben.

Als je diff() in DateTime gebruikt, dan moet je wel wat meer rekenen. Want je kan volgens mij niet eenvoudig het aantal seconden bepalen. Zie ook dit: https://www.designcise.com/web/tutorial/how-to-get-the-datetime-difference-in-seconds-between-two-datetime-objects-in-php

Als ik het zou oplossen, dan zou ik terugvallen op dit:
$interval = $current_time->getTimestamp() - $user_last_activity->getTimestamp();

Het verschil wat je wilt hebben, die bereken je door de huidige tijd te pakken, en dan de laatste tijd ervanaf te trekken. Dus als het 13:37 is, en de laatst geregistreerde tijd was 13:24, dan zit er 13 minuten verschil tussen. In dat geval is iemand offline als je als time-out waarde 5 minuten gebruikt. Als het laatste moment om 13:34 was, dan is diegene online. Snap je?

Het loont met lastige programmatische vraagstukken om je probleem uit te zetten in leesbare volzinnen.
Ik zal dus een soort interval moeten zetten
Ja, die heb je dus al. Dat is het resultaat als je de tijd van activiteit van de huidige tijd aftrekt.
En dan is het kijken of die korter (online) of langer (offline) is dan 5 minuten.
Zo iets ? $min += $interval->h * 60;

[size=xsmall]Toevoeging op 13/03/2023 15:17:24:[/size]


<?php
//Time A
$timeA = '1518223062';

//Time B (Which I set at the current time)
$timeB = time();

//five minutes in seconds
$fiveMinutes = 60 * 5;

//check if current time is after 5 minutes the initial time
if ( ($timeA+$fiveMinutes) <= $timeB) {
echo "True";
}
else {
echo "False";
}


?>
Ja, qua opzet wel, maar toch zou ik dit niet gebruiken, omdat je met DateTime (wat je eerst al gebruikte in je voorbeeld) een veel elegantere opzet hebt om met datums te rekenen en te formatteren.

Het enige wat er mis is, dat s je controle in je if-statement waarin je bepaalt of er onlien of offline getoond moet worden.
Deze berekening is prima:

$interval = $current_time->getTimestamp() - $user_last_activity->getTimestamp(); 

Je if-je is alleen nog niet goed.
uit de manual onder DateDiff:

<?php
$origin = new DateTimeImmutable('2009-10-11');
$target = new DateTimeImmutable('2009-10-13');
$interval = $origin->diff($target);
echo $interval->format('%R%a days');
?>


Vervang daarin die format door format('%i') om het aantal minuten te verkrijgen.

En $origin en $target zijn dan je date's die je al had
Ik krijg met
echo $interval->format('%i');

0 te zien. Deze functie gaat om het formatteren, en niet om het rekenen. Dan moet je dus dit gebruiken.

i Minutes with leading zeros 00 to 59

Dus je hebt er weinig aan. Dan is mijn oplossing toch beter, en treffender met een simpele aftreksom.
Hoe zal ik de ifje moeten doen ik snap het even niet meer

Reageren