Automatisk endre verdi i databasen om ikke det skjer "manuelt" etter XX minutter?

Mr Vest

Sjefen over alle sjefer!
En greie jeg bruker for og kunne se hvem som er online på nettsiden er altså slik at når noen logger inn, da endrer den en verdi i databasen fra 0 til 1. Samme skjer også når noen logger ut, at den altså endrer verdi fra 1 til 0. Problemet er forsåvidt at ca 0,5% bruker "logg ut" knappen på nettsiden.

Er det noe jeg kan gjøre for at denne skal endre seg tilbake til 0 igjen automatisk etter XX minutter? Tenker at det vil jo allikevel gi en pekepinn på hvem som var aktiv f.eks site 30 minutter. Er dette noe jeg evt må gjøre fra phpmyadmin? Eller er det noe jeg må gjøre i koden som endrer verdien fra 0 til 1?

- På forhånd, takk for svar. :)
 

Nextri

Rebel
hvis du vil at noe skal skje ved jevne mellomrom, uten at noen bruker gjør noe spesifikt, så trenger du å utforske det som heter crontab.

En bedre måte å finne ut hvor mange som er online på er å oppdatere et felt som inneholder en timestamp for hver bruker, hver gang de gjør noe. og så ta en SELECT på hvor mange som har en timestamp som er nyere enn f.eks. 30 minutt, for å få ett tall på hvor mange om har vært aktiv de site 30 min.

Det å ha 0 og 1 om de er logget inn eller ikke er en dårlig løsning med tanke på å vite om noen er innlogget eller ikke.
 

Mr Vest

Sjefen over alle sjefer!
Det ordet "Crontab" skremte meg. Alt som inneholder ordet "Cron" skremmer meg. Kanskje derfor jeg ikke spiser kroneis også.

Dette du nevner med timestamp høres intressant ut. Jeg mener jeg forstår hva du mener, men hvilken spørring må jeg kjøre mot databasen for og lage feltet som skal oppdateres med en slik timestamp? Må ikke feltene som skal inneholde en slik timestamp være noe spesielt, som f.eks "datetime" eller noe?
 
Selv bruker jeg vanlige int-felt til alt sånt. Hver gang siden lastes, sjekker jeg f.eks. om det er noen rader i brukertabellen WHERE sistaktivvariabel < (time() - 60*30). Dersom det finnes slike rader, betyr det at brukeren ikke har vært aktiv på en halvtime (60 * 30 sekunder). sistaktivvariabel må du selvsagt oppdatere til time() hver gang brukeren laster siden for at dette skal virke.
 

Mr Vest

Sjefen over alle sjefer!
Skjønner ja.. Det var godt og utfyllende svar. Jeg skal teste nå med en gang for og se hvordan det der funker for meg, og om jeg faktisk forstod det riktig. :)


Update;
Den var litt vrien den der. Jeg fikk det jo på en måte til og fungere, men det ser ut til at den ikke viser fra siste halvtimen, men heller noe temmlig mye mer enn det. Den skulle etter rett bare vist meg i lista, men så kommer det heller frem ganske mange.

Her er koden jeg bruker for og oppdate databasen når siden lastes:

$godjul=time();
mysql_query("update users set online='$godjul' where id={$_SESSION['userid']}");


Og her er koden jeg bruker for og hente ut brukerne som har lastet siden siste halvtimen:

$datogreier='< (time() - 60*30';
$getusers=mysql_query("select * from users where `online` ='$datogreier'",$c);


Den skal etter rett kun hente ut meg med denne koden som sagt, mens den ser ut til og hente ut fra ganske lang tid tilbake. Noen tanker om hva jeg kan gjøre med koden for at den skal hente ut fra siste 1800 sekunder? På forhånd, takk! :)
 
Sist redigert:
$godjul=time();
mysql_query("update users set online='$godjul' where id={$_SESSION['userid']}");
Første spørsmål blir hvorfor du setter $godjul i enkle anførselstegn i queryen. Er det ikke en integer? For alt det jeg vet er det mulig å beregne større-enn-og-mindre-enn med stringer i MySQL, jeg har aldri prøvd det, men ...

(Bruken din av { og } skal jeg ikke kommentere da jeg aldri har brukt sånne selv men går ut fra at du vet hva du driver med akkurat der og at dette derfor er riktig.)

Og her er koden jeg bruker for og hente ut brukerne som har lastet siden siste halvtimen:

$datogreier='< (time() - 60*30';
$getusers=mysql_query("select * from users where `online` ='$datogreier'",$c);

Og putter du den der sammen ser du at det som sendes til databasen blir
Kode:
select * from users where `online` ='< (time() - 60*30'

... noe som selvsagt ikke helt gir mening. Du skal sjekke om verdien er mindre enn et gitt tidspunkt, ikke om den er lik en bestemt string (og dessuten mangler det en parantes). Erstatt disse to linjene med noe slikt istedetfor:

Kode:
$datogreier = time() - 60*30;
$getusers = mysql_query("select * from users where online < $datogreier", $c);

Denne koden forutsetter at online er en integer (eller iallefall et eller annet tall) og ikke en string.
 

Mr Vest

Sjefen over alle sjefer!
Hva mener du med at "Denne koden forutsetter at online er en integer (eller iallefall et eller annet tall) og ikke en string." ? Med integer, da mener du tall eller?

Jeg vet ikke helt hvorfor jeg bruker {} Men jeg har aldri fått stringer som ser slik ut: $string[MED SÅNNE SOM DETTE] greier til og fungere uten {} rundt dem. Om jeg ikke bruker [] funker det bra uten {}..

Jeg forsøkte og ta bort de 2 enkle anførseltegenene jeg hadde i "update users set online='$godjul' " , og deretter forsøkte jeg den nederste kodesnutten din. Den kjørte ut en liste over alle brukerne i databasen, enda den første queryen hadde blitt kjørt, og det etter rett kun skule vises ett medlem i lista.

Skal kikke litt nærmere på dette her etterpå. :)
 
... Brems litt. Vi har misforstått hverandre. Jeg har iallefall misforstått deg.

Denne koden viser ikke brukere som har vært aktive den siste halvtimen. Den viser brukere som IKKE har vært aktive den siste halvtimen! [Grunnen til at jeg gav deg en slik funksjon er selvsagt at det er DE brukerne scriptet ditt bør ha interesse av å gå gjennom for å endre innloggetstatus til null.]

Endre < til >, så bør problemet være løst.
 
Sist redigert:

Mr Vest

Sjefen over alle sjefer!
Haha, sjå på det ja. Da var listen krympet ned til riktig antall ja. Takk. :D

Var jo på en måte 2 fluer i en smekk dette her da. Slik kan man jo også sjekke medlemmer som gjerne ikke har vært aktive på X antall sekunder.
 
Topp