Hallo,

Ik heb een database(online) waarin de tijd van het inloggen wordt opgenomen.
Als de user uitlogd wordt dit record verwijderd , maar sommige users loggen niet uit , ze verlaten gewoon zonder uitloggen, dus het record blijft bestaan.
Nu wil ik zelf het record verwijderen door te gaan kijken naar de inlogtijd en deze vergelijken met de huidge tijd - 2uur.

Als de inlogtijd kleiner is dan de huidige tijd -2 uur mag het record verwijderd worden.

Ik slaag er niet in deze tijden te kunnen vergelijken , eook niet om de tabel af te lopen.

Wie kan mij hiermee helpen AUB
Gaat het om een systeem dat je kan zien wie er momenteel online is? In dat geval lijkt mij zinvoller om bij elke pageview de actuele tijd te updaten bij die gebruiker. In dat geval is twee uur wel een erg lange interval.

Een query die je kan gebruiken is als volgt:

DELETE FROM tblName WHERE date_loggedin < (NOW() - INTERVAL 2 HOUR)


andere benadering:

Je insert altijd een record met de huidige tijd en als iemand uitlogt, vul je ook de kolom "uitgelogd" met dat tijdstip.
Dat record laat je staan.
Dan kun je nog steeds dezelfde info opvragen die je nu wilt hebben, maar dan met de query

SELECT *
FROM onliners
WHERE inlogtijd > now() - interval 2 hour AND uitgelogd is null

Voordeel:
Je kunt ook terug kijken wanneer iemand voor het laatst online was

--
INSERT INTO onliners (userid, inlogtijd) VALUES (1234, NOW());

uitloggen
UPDATE onliners SET uitgelogd = NOW()
WHERE userid = 1234
ORDER BY inlogtijd DESC
LIMIT 1;

Maar niet iedereen logt altijd uit. Soms wissen zelf hun cookies, of komen ze terug als de koekjes alweer over hun houdbaarheid zijn.
Beide strategieën hierboven slaan misschien de plank mis, want deze gaan uit van de inlogtijd, en gaan er vervolgens vanuit dat iemand na twee uur niet meer actief is? Dit zegt niets over de activiteit van een gebruiker. Een gebruiker kan best na twee uur nog bezig zijn, wordt deze dan geforceerd uitgelogd? En misschien wil iemand wel ingelogd blijven vanaf zijn/haar thuis-PC of -laptop.

Wat is precies het probleem van ingelogd blijven (of het automatisch doorstarten ervan)?

Het probleem is misschien wel juist het meten van inactiviteit. Dit zou je bijvoorbeeld op kunnen lossen door een houdbaarheidsdatum en -tijd in te stellen. Elke keer als een ingelogd persoon de site ververst, schuif je de "verloopdatum" vooruit, uitgaande van de huidige tijd plus een timeout (die je zelf zou kunnen tweaken). In deze routine zou je ook kunnen controleren of er logins verlopen zijn, en deze on-the-fly verwijderen, of je neemt dit op in een aparte routine (cron) die dit periodiek opschoont.

De vraag is ook: waarvoor gebruik je dit: is dit om ingelogde/actieve gebruikers te managen, of is dit, zoals hierboven aangehaald, een middel om een soort van overzichtje te genereren van de (op dat moment) "actieve" gebruikers?

Ik weet ook niet in welke setting dit alles gebruikt wordt. Misschien moeten de gebruikers ook opgevoed worden om uit te loggen als ze klaar zijn met het systeem?

Het wordt mogelijk nog interessanter als je een "onthoud mij" functionaliteit hebt (voor niet-publieke machines), waarbij gebruikers in principe onbeperkt ingelogd zijn, zo lang dit technisch/praktisch mogelijk blijft.

Het oorspronkelijke probleem heeft waarschijnlijk ook zijn oorsprong in het feit dat er geen "houdbaarheidsdatum" op de records zit, en er vervolgens ook geen mechaniek is om deze op te schonen. Het beste lijkt mij om dit ontwerp om te gooien naar een aanpak waar dingen kunnen verlopen, en wellicht ook automatisch kunnen worden doorgestart indien dat gewenst is.
Arien,

Er is niks dat werkt, het is wel in de programmatie van phprunner.
ziet er zo uit.

date_default_timezone_set('Europe/Brussels');

$data = array();
$data["tijd"] < (NOW() - INTERVAL 2 HOUR) ;
DB::Delete("online", $data );



hierop krijg ik steeds de fout : syntax error, unexpected '2' (T_LNUMBER) in line 4

alvast bedankt voor de vlugge reactie.
Ik heb het over een SQL-query. Die zie ik je hier nergens uitvoeren. Jij behandelt dat als PHP wat niet de bedoeling is.

Ik neem van harte aan dat je datum wel hebt opgeslagen als een DATETIME type in je database
$data is een array, maar vervolgens (regel 4) voer je een vergelijking uit met <. Het gedeelte "(NOW() - INTERVAL 2 HOUR)" heeft ook geen betekenis binnen PHP, want dit is SQL-code. Dit staat ook niet tussen quotes, dus PHP probeert hier chocola van te maken, wat natuurlijk niet lukt. Los daarvan, je kent niets aan $data toe, want je voert een <-vergelijking uit, en geen toekenning met een =-teken.

Ik weet niet precies wat DB::Delete() doet, maar ik neem aan dat de eerste parameter de tabelnaam bevat, en de tweede parameter waarschijnlijk een lijst van condities?

Dan zou ik zoiets op regel 4 verwachten, aangenomen dat de kolom in kwestie "tijd" heet:
<?php
$data['tijd'] = '< (NOW() - INTERVAL 2 HOUR)';
?>

Of wellicht simpelweg:
<?php
$data[] = 'tijd < (NOW() - INTERVAL 2 HOUR)';
?>


Maar de vraag is hoe DB::Delete() intern werkt, en hoe daarmee de uiteindelijke query eruit komt te zien.
Arien,

Ik heb het nu in een query geplaatst , en inderdaad nu werkt het.
De manier in de phprunner begrijp ik ook niet goed.

Alvast velen dank voor dit alles.
Fijn dat het werkt.
PHPrunner ken ik overigens niet.
Ariën,

Nogmaals bedankt.

Een van de beste programma's om php te genereren, zelf kan je daar ook wijzigingen aan brengen en toeltjes bij schrijven, het is van xlinsoft in America.
De prijs is wel duur maar je krijgt er wel wat voor 499$ 1 jaar updates inbegrepen na dat jaar telkens 199$ per jaar voor updates.
Maar ben er heel tevreden van, heb momenteel een data site van meer dan 200.000 records . waarin ook een grafische kaart aan te pas komt.(enkel interessant voor geocachers )www.dcjt.be/geo_database
Heb er zelf de google authenticator in verwerkt.

Reageren