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>
format(%i) gaat inderdaad fout als de periode meer dan 1 uur beslaat.

Toch denk ik dat de bepaling in de query het eenvoudigste is: je hebt geen bepaling van NU nodig in PHP en je hoeft in PHP niet te rekenen om dat resultaat vervolgens met een waarde in seconden te vergelijken.

In plaats daarvan zou je alleen een kolom met de waarde 1 of 0 hebben.

Via SQL kan ook. Er leiden meer wegen naar Rome. :-)

Maar ok denk dat mijn weg momenteel voor de topicstarter het snelste is, omdat de oplossing al op zijn problematische code al voortgeborduurd is.

Gezien de beperkte kennis van PHP bij de topicstarter, denk ik dat we het niet complex moeten maken. Maar als hij het wilt proberen, dan is hij er vrij in. ;-)



ik heb het nu zo


$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 > $stored_activity) {
					$user_activity = '<span class="badge badge-success" style="background-color: red; font-size: 15px; font-weight: lighter;">offline</span>';
				} else {
					$user_activity = '<span class="badge badge-success" style="background-color: green; font-size: 15px; font-weight: lighter;">Online</span>';
				}
			} else if (is_null($stored_activity)) {
				$user_activity = '<span style="color:orange">N/A (Refresh)</span>';
			}

nu gaan de oude wel offline maar als een nieuwe online komt en die gaat weg blijft die op online staan
Kijk eens wat er in de $interval zit, en wat er in $stored_activity zit?
Haal beiden eens door var_dump().

In $interval zit een klein getal van het aantal seconden tussen toen en nu.
En in $stored_activity zit een groot getal die het aantal seconden sinds de epoch (1 jan 1970) presenteert.
Dus je zal iets hebben van 4321 (01:12:01 uur) is groter dan 1678716309 (ma 13 maart 2023 16:05:09). Dat is dus nooit waar, dus OFFLINE.

Maar....
Dat wil je niet meten, je wilt weten of het aantal seconden van die interval kleiner of groter is dan 5 minuten, oftewel 300 seconden.

Snap je het nu? Probeer anders eens op klad te uitrekenen met een paar datums in minuten.
Dan zal je het eenvoudige rekentruukje wel doorhebben.
dan krijg ik als volgende

int(64638)
string(19) "2023-03-13 00:21:48"
int(3048)
string(19) "2023-03-13 17:28:18"
offline
int(2469)
string(19) "2023-03-13 17:37:57"
offline
int(1213)
string(19) "2023-03-13 17:58:53"
Online
28388282
int(562)
string(19) "2023-03-13 18:09:44"
Online
En welke is nu welke?
Wat staat er in zo'n veld last_activity? Geef eens een voorbeeld van zo'n waarde.
$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 ($stored_activity > $interval) {
echo var_dump($interval) . "<br>";
echo var_dump($stored_activity) . "<br>";
$user_activity = '<span class="badge badge-success" style="background-color: red; font-size: 15px; font-weight: lighter;">offline</span>';
} else {
echo var_dump($interval) . "<br>";
echo var_dump($stored_activity) . "<br>";
$user_activity = '<span class="badge badge-success" style="background-color: green; font-size: 15px; font-weight: lighter;">Online</span>';
}
} else if (is_null($stored_activity)) {
$user_activity = '<span style="color:orange">N/A (Refresh)</span>';
}


de veld last_activty staat de datum met de tijd in
Die code had ik al eerder gezien!

- Ariën - op 13/03/2023 19:27:23

Wat staat er in zo'n veld last_activity? Geef eens een voorbeeld van zo'n waarde.


^^
`last_activity` datetime DEFAULT NULL,

2023-03-13 18:09:44
Prima waarde. Een ruim uur geleden dus!
Dat klopt dus!

Dan moet je alleen kijken of de $interval groter of kleiner is dan 300 seconden.
Als je dat even in je if-statement verwerkt, dan klopt het.

Probeer maar.

Reageren