online / offline status
Pagina: « vorige 1 2 3 4 volgende »
$interval = date_diff($date1, $date2)
Date 1 de tijd van de nu en date2 checken wat de tijd in last_activity staat
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.
Gewijzigd op 13/03/2023 13:15:58 door - Ariën -
Ik zal dus een soort interval moeten zetten
En dan is het kijken of die korter (online) of langer (offline) is dan 5 minuten.
Toevoeging op 13/03/2023 15:17:24:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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:
Je if-je is alleen nog niet goed.
Gewijzigd op 13/03/2023 15:26:18 door - Ariën -
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$origin = new DateTimeImmutable('2009-10-11');
$target = new DateTimeImmutable('2009-10-13');
$interval = $origin->diff($target);
echo $interval->format('%R%a days');
?>
$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
echo $interval->format('%i');
0 te zien. Deze functie gaat om het formatteren, en niet om het rekenen. Dan moet je dus dit gebruiken.
Quote:
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.
Gewijzigd op 13/03/2023 15:33:08 door - Ariën -
Hoe zal ik de ifje moeten doen ik snap het even niet meer
Is $interval hoger ( > ) of lager ( < ) dan 300 seconden (5 minuten).
Als je onbekend bent met if (basis PHP), lees dan dit even door:
https://www.php.net/manual/en/control-structures.if.php
Gewijzigd op 13/03/2023 15:38:44 door - Ariën -
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.
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. ;-)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$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>';
}
$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
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.
Gewijzigd op 13/03/2023 19:11:02 door - Ariën -
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
Wat staat er in zo'n veld last_activity? Geef eens een voorbeeld van zo'n waarde.
Gewijzigd op 13/03/2023 19:30:40 door - Ariën -
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
- 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.
^^
Gewijzigd op 13/03/2023 19:33:56 door - Ariën -
2023-03-13 18:09:44
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.
Pagina: « vorige 1 2 3 4 volgende »