online / offline status

Overzicht

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 volgende »

Hendrk jornie

hendrk jornie

13/03/2023 12:46:46
Anchor link
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
 
PHP hulp

PHP hulp

25/04/2024 09:44:34
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 13:08:26
Anchor link
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.
Gewijzigd op 13/03/2023 13:15:58 door - Ariën -
 
Hendrk jornie

hendrk jornie

13/03/2023 15:03:24
Anchor link
Ik zal dus een soort interval moeten zetten
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 15:05:52
Anchor link
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.
 
Hendrk jornie

hendrk jornie

13/03/2023 15:14:34
Anchor link
Zo iets ? $min += $interval->h * 60;

Toevoeging op 13/03/2023 15:17:24:


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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";
}



?>
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 15:24:33
Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$interval = $current_time->getTimestamp() - $user_last_activity->getTimestamp();

Je if-je is alleen nog niet goed.
Gewijzigd op 13/03/2023 15:26:18 door - Ariën -
 
Ivo P

Ivo P

13/03/2023 15:26:19
Anchor link
uit de manual onder DateDiff:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');
?>



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
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 15:29:47
Anchor link
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.
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 -
 
Hendrk jornie

hendrk jornie

13/03/2023 15:35:05
Anchor link
Hoe zal ik de ifje moeten doen ik snap het even niet meer
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 15:37:14
Anchor link
Het is eigenlijk gewoon simpel rekenen.

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 -
 
Ivo P

Ivo P

13/03/2023 16:26:54
Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 16:44:56
Anchor link
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. ;-)
 
Hendrk jornie

hendrk jornie

13/03/2023 18:34:43
Anchor link
ik heb het nu zo

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
            }

nu gaan de oude wel offline maar als een nieuwe online komt en die gaat weg blijft die op online staan
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 19:07:27
Anchor link
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.
Gewijzigd op 13/03/2023 19:11:02 door - Ariën -
 
Hendrk jornie

hendrk jornie

13/03/2023 19:20:54
Anchor link
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
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 19:27:23
Anchor link
En welke is nu welke?
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 -
 
Hendrk jornie

hendrk jornie

13/03/2023 19:31:24
Anchor link
$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
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 19:33:27
Anchor link
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.


^^
Gewijzigd op 13/03/2023 19:33:56 door - Ariën -
 
Hendrk jornie

hendrk jornie

13/03/2023 19:41:30
Anchor link
`last_activity` datetime DEFAULT NULL,

2023-03-13 18:09:44
 
- Ariën  -
Beheerder

- Ariën -

13/03/2023 19:46:23
Anchor link
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.
 

Pagina: « vorige 1 2 3 4 volgende »

 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.