Avatar billede hindbersnitten Nybegynder
19. oktober 2007 - 09:38 Der er 16 kommentarer og
1 løsning

Automatisk logud

Jeg har følgende problem:

Jeg har en fuktion på min hjemmeside, hvor man kan se hvor mange medlemmer der er logget ind.

Mit problem er at hvis man er logget ind og så forlader siden uden at have logget sig ud. Så står man stadig som online.

Jeg bruger følgende kode.

process.php

$sql = "UPDATE " . USERS . " SET online = 'y' WHERE userid = '$uid' AND login = '$uname'";
$result = mysql_query($sql ,$db);


logout.php

$sql = "UPDATE " . USERS . " SET online = 'n' WHERE userid = '$uid'";
$result = mysql_query($sql ,$db);


theader.php

<?php

$sql2 = "select count(*) from ". USERS ." where online = 'y'";
$result2 = mysql_query($sql2 ,$db);
$row = mysql_fetch_row($result2);
$members = $row[0];

?>

Jeg er ret ny i det her php univers. og ved ikke selv hvordan jeg løser det her problem.
Avatar billede sone Nybegynder
19. oktober 2007 - 11:59 #1
du kunne jo have et tidsstempel på hver user/login, og så automatisk sætte online='n* baseret på inaktivitet
Avatar billede hindbersnitten Nybegynder
19. oktober 2007 - 12:49 #2
Er det en indstilling der skal laves i MySQL. Eller hvordan gør man det....
Avatar billede sone Nybegynder
19. oktober 2007 - 13:28 #3
du kunne lave følgende update hver gang du viser en side (hvor du har brug for online-count):
$sql = "UPDATE " . USERS . " SET online = 'n' WHERE timestamp<".time()-$tilladtInaktivInterval;
Avatar billede hindbersnitten Nybegynder
19. oktober 2007 - 15:53 #4
Har lavet en timestamp "hvis det heder det" i tabellen USERS i MySQL der registrer tiden, hvor når man loggede ind på siden.

Skal jeg så bare sætte din kode ind såden her:

$sql = "UPDATE " . USERS . " SET online = 'n' WHERE timestamp<".time()-$900;

Jeg går ud fra at det tal jeg sætter ind skal være i sekunder????
Avatar billede jgivoni Nybegynder
19. oktober 2007 - 16:06 #5
Du bør nok opdatere en brugers timestamp for hver side han/hun ser, ellers er det jo ikke inaktivitet du måler men blot hvor lang tid der er gået siden login.
Avatar billede hindbersnitten Nybegynder
19. oktober 2007 - 16:14 #6
Kan godt se hvad du mener.
Vil du hjælpe mig med det så.

Kan vil stadig bruge den tabel jeg har lavet der registrer tiden???
Avatar billede jgivoni Nybegynder
19. oktober 2007 - 16:31 #7
Du vil kunne bruge den tabel du allerede har.

Det nemmeste er nok hvis din timestamp kolonne har typen bigint (kan ikke huske om en alm. int er stor nok...), så kan du bare indsætte tiden målt i antal sekunder siden 1. Jan 1970.
Det gøres ved at køre denne update for hver sidevisning:

$sql = "UPDATE " . USERS . " SET timestamp = " . time() . ", online = 'y' WHERE userid = '$uid';

(hvor $uid er brugerens id, der gemmes i en session)

Denne update skal så køres hver gang du vil have opdateret hvem der er online:

$sql = "UPDATE " . USERS . " SET online = 'n' WHERE timestamp < " . time() - 900;

(hvor 900 er max antal sekunders inaktivitet = 15 min)

Håber det kan bruges. Spørg hvis du skal vide mere.
Avatar billede hindbersnitten Nybegynder
19. oktober 2007 - 19:40 #8
Hej. Jeg kan ik få de til at virke.

Hvis du har løst og tid vil jeg blive glad hvis du vil prøve at se på de 3 filer jeg arbejder med. måske du så kan fortælle mig hvor koden skal sættes ind og om der er andet galt.
Jeg har også lagt min MySQL kode til gennemskue.

Hvis du vil hjælpe så se lige her:
http://www.2340.dk/hjelp.html
Avatar billede jgivoni Nybegynder
19. oktober 2007 - 20:52 #9
Jeg kan nok godt få tilsidesat lidt tid til det.

Jeg kan se at du har oprettet time med typen timestamp og tilmed sat den til automatisk opdatering ved update. Det er en udmærket idé, helt i tråd med hensigten, - MEN det gør det lidt mere besværligt for os, da vi skal beregne og formatere dato/tids-stempler, hvilket jeg aldrig kan huske i hovedet hvordan det fungerer :-) Hvis ikke du skal bruge selve aktivitetsdato/tidspunktet til noget andet end at beregne inaktivitetsperiode, ville det være nemmere hvis du skiftede type til bigint som foreslået før. Men vi kan også forsætte som det er nu, hvis du ønsker. Så må vi jo prøve os frem ;-)

Jeg vil kigge på phpkoden for at se, hvor det skal ind.
Avatar billede jgivoni Nybegynder
19. oktober 2007 - 21:02 #10
Det er kun filen theader (som jeg går ud fra inkluderes på alle sider) der skal tilføjes lidt i.

Før denne linie, der tæller antal online brugere:
$sql2 = "select count(*) from ". USERS ." where online = 'y'";

skal der indsættes sql-kørsel for opdatering af den pågældende brugers aktivitet, samt sql kørsel for opdatering af kolonnen online baseret på hver brugers sidste aktivitetstidspunkt.

Hvis du er med så langt, kan vi se på hvad der rent faktisk skal stå.
Avatar billede hindbersnitten Nybegynder
20. oktober 2007 - 09:10 #11
Hej igen.

Jeg tror nok jeg er med ind til vider.

Jeg har sat denne kode ind på min side theader.php:

<?php

$sql2 = "select count(*) from ". USERS ." where online = 'y'";
$result2 = mysql_query($sql2 ,$db);
$row = mysql_fetch_row($result2);
$members = $row[0];

?>

Og for at vise resultatet i theader.php:

<?php printf($members) ?>

Og det virker oki. Den viser tivertifald hvor mange der er logget ind.
Nu er jeg så kommet så langt. Og ja, jeg forstår ind til vider hvad der sker, når koden køres på sidn.

Så får jeg så en smule hovedepine igen, når jeg skal prøve at sætte den sidste del af koden ind på siden.

Først prøvede jeg at sætte den her del af koden ind i toppen af theader.php:

<?php

$sql = "UPDATE " . USERS . " SET timestamp = " . time() . ", online = 'y' WHERE userid = '$uid';

?>

Når jeg sætter den kode ind, så bliver min side helt blank. Der bliver ikke vist noget som helst.

Så prøvede jeg sådan her:
<?php

$sql = "UPDATE " . USERS . " SET timestamp = " . time() . ", online = 'y' WHERE userid = '$uid';
$result = mysql_query($sql ,$db);

?>

Samme resultat. Siden bliver helt blank, og resten af siden bliver ikke vist.

Så prøvede jeg den anden del af koden:
<?php

$sql = "UPDATE " . USERS . " SET online = 'n' WHERE timestamp < " . time() - 900;

?>

Når jeg sætter den del af koden ind sker der ingen ting. Siden bliver bare vist som den skal. Men den ændre ikke noget i MySQL.

Så prøvede jeg, som før at gøre sådan her:

<?php

$sql = "UPDATE " . USERS . " SET online = 'n' WHERE timestamp < " . time() - 900;
$result = mysql_query($sql ,$db);

?>

Men der sker heller ikke noget. Min side bliver bare vist. men uden ændringer i MySQL.



Nu vil jeg så prøve at ænder MySQL til bigint som du skriv.
Kan det passe at der i Tabellen bare kommer til at stå 2007 som tiden man loggede ind????
Avatar billede hindbersnitten Nybegynder
20. oktober 2007 - 09:21 #12
Det hjælper mig heller ikke at lave MySQL om til bigint.
Der sker det samme som før.
Nemlig ingen ting :-)
Avatar billede jgivoni Nybegynder
20. oktober 2007 - 15:32 #13
Hej igen Hindbersnitte...

Det der gør at der ikke sker noget er, at du i MySQL omdøbte kolonnen til at hedde "time" i stedet for "timestamp". Dvs. navnet er "time",mens typen er "timestamp" (eller "bigint").

I eksemplerne herover skriver du (kopieret fra min kode):
... WHERE timestamp < " . time() - 900
men der er ikke nogen kolonne der har navnet "timestamp" så det vil give en MySQL fejl. Da du ikke printer denne fejl ud, får du en blank side.

Så hvis du vil bibeholde at kolonnen hedder "time" (hvilket er helt ok - den kunne også hedde "last_seen_online" for at være mere deskriptiv) så skal du skrive "time" i alle SQL-kald i stedet for "timestamp".

Det første, der registrerer at en bruger er online, ser således ud:

$sql = "UPDATE " . USERS . " SET time = " . time() . ", online = 'y' WHERE userid = '$uid'";

Bemærk det afsluttende " jeg har sat ind (manglede desværre i min første kode...)

Hvis det virker så langt, fortsætter du med det kald, der skal sætte brugernes status til offline hvis der er gået for lang tid siden sidste sidevisning:

$sql = "UPDATE " . USERS . " SET online = 'n' WHERE time < " . time() - 900;

Bemærk at hver linie, der starter med $sql = "... ikke udfører noget i sig selv. Det er bare en streng der tildeles en værdi. For at udføre selve SQL kaldet, skal hver af disse linier selvfølgelig efterfølges af noget i retning af:
$result = mysql_query($sql ,$db); // Som er det du har brugt indtil videre

Hvis du gerne vil have en fejlmeddelelse hvis ikke det går som det skal, kan du bruge dette istedet:
$result = mysql_query($sql ,$db) or die("Fejl i SQL: $sql");

Lad mig høre om det hjælper.
Avatar billede hindbersnitten Nybegynder
20. oktober 2007 - 23:13 #14
Hej jgivoni.

Nu tror jeg, at jeg er ved at være der.
Nu opdatere den tiden i MySQL

Jeg bruger som du skrev:

<?php
$sql = "UPDATE " . USERS . " SET time = " . time() . ", online = 'y' WHERE userid = '$uid'";
$result = mysql_query($sql ,$db) or die("Fejl i SQL: $sql");
?>

Men når jeg køre den her kode:

<?php
$sql = "UPDATE " . USERS . " SET online = 'n' WHERE time < " . time() - 900;
$result = mysql_query($sql ,$db) or die("Fejl i SQL: $sql");
?>

Får jeg den her fejl - Fejl i SQL: -900

Og tak for hjælpen med den kode der fortæller hvad fejlen kan være. Jeg lære godt nok meget af det her.

Er det - 900; der er skrevet forkert?
Avatar billede jgivoni Nybegynder
21. oktober 2007 - 00:30 #15
Ja, der har vist sneget sig noget typisk php typeforvirring ind i den sidste sql.
Mon ikke det vil hjælpe med en parantes omkring ( time() - 900 )
Avatar billede hindbersnitten Nybegynder
21. oktober 2007 - 15:39 #16
Hej jgivoni.

Jep, nu virker det.
1000 tak for hjælpen.
Du har læret mig meget om det her php.
Jeg har nu en meget stører forståelse for hvordan det hele virker.
Du skal så følgelig have dine point. Du fortjæner godt nok mere end de 30, men ved ikke om jeg kan lave det om.

Så ligger du lige et svar.

Ps. her komer den sidst del af koden der virker, til dem der er interaseret:

<?php
$sql = "UPDATE " . USERS . " SET online = 'n' WHERE time < " . ( time() - 900 );
$result = mysql_query($sql ,$db) or die("Fejl i SQL: $sql");
?>

Igen tak til jgivoni.
Avatar billede jgivoni Nybegynder
21. oktober 2007 - 20:27 #17
Selvtak, det har været en fornøjelse.
Godt hvis du har lært noget, - vi er jo alle sammen i den situation fra tid til anden hvor den hurtigste vej til større forståelse er et praktisk eksempel og en kyndig vejleder :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester