Avatar billede goofysite Nybegynder
06. august 2009 - 16:48 Der er 8 kommentarer og
1 løsning

Log ud scripts.

Hej, jeg har lavet en del login systemer i tiden, der er blot en ting som jeg aldrig har formået at programere.
Et ordenligt logud scripts.

Jeg har et almindeligt login scriptc som laver en session der fortæller at man er online, og når man logger ud, så sletter den den seesion igen. Men problemet er bare at jeg gerne vil have det sådan at det også bliver lagt ind i databasen. Så man kan se om brugeren er online. Der er bare et problem. hvis de bare lukker browseren, uden at trykke på "Log ud". Så laver den ikke dataerne i databasen om til offline.. ?

Håber at der er nogle kloge hjerner her som vil hjælpe mig... ;-)

Hilsen Goofy
Avatar billede jenz3n Nybegynder
06. august 2009 - 18:15 #1
Der er mange gode bud på hvordan man gør det, rent teoretisk er det ikke muligt at lave en optimal løsning, da HTTP forbindelsen ikke er vedvarende, men her er to løsninger som fungerer i praksis:

Du har sandsynligvis en tabel med brugere i din database, opret her et felt kaldet 'lastActivity'. Øverst i dine PHP filer, eller nogen headers du inkluderer på alle sider, laver du en mySQL query: mysql_query('UPDATE `users` SET `lastActivity` = ' . time() . ' WHERE `id` = ' . $_SESSION['userId'] . '); (Bruger du noget PHP framework kan du sandsynligvis bruge noget ala Registry::getUser()->lastActivity = time())

Alle online usere kan så hentes: mysql_query('SELECT * FROM `users` WHERE `lastActivity` > ' . time()-300);
De 300 sekunder er 5 minutter, altså bliver du betragtet som logget ud efter 5 minutters inaktivitet. Hvis du har sider hvor folk har en tendens til at være i længere end 5 minutter, så bliver du nød til at lave noget AJAX som kan hente en side.

En anden effektiv måde at holde styr på sine besøgende er at separere statiske bruger i en tabel og have en tabel over online brugeres sessionId i en anden. Med den fremgangsmåde kan du samtidig logge brugere ud fra et admin interface eller andet.
du tjekker så øverst i alle dine filer om brugeren har en tilsvarende række i tabellen med hans sessionId, samtidig opdaterer du et felt ala lastActivity og fjerner alle rækker som er ældre end eksempelvis fem minutter.

Jeg håber det giver mening :)
Avatar billede mbm2016 Nybegynder
06. august 2009 - 18:38 #2
Yes yes... altså det jeg har gjort er at lave en administrations side som sjovt nok også adminisrerer brugerne på siden.

Jeg håber du har tid til at læse det :=D

Det dit nye login system skal kunne er jo at se om brugerne er online så her er hvad du skal gøre:

1. DU går ind i dit login script, og der skal du modificere lidt. Fordi når du gemmer dine brugere i databasen skal du også gemme den tid de loggede på. (I MySql skal du bare åbne PHPAdmin og ændre i din database struktur så der kommer et nyt felt med navnet logontid for eksempel)

2. Derefter laver du en ny php side som du plejer, og opretter forbindelse til din database.

3. Lav derefter en variabel du kalder $nutid og ilæg tiden nu og minus med det antal sekunder brugeren må være online før administrations siden automatisk logger ham/hende af. Jeg ville anbefale 10 min. (Dvs. at hvis brugeren logger på og bagefter lukker browser vinduet vil der gå ti miniutter og han/hun vil blive logget af.)

Eksempel på kode:
$nutid = time() - (60*10);

4. Nu skal du så lave en løkke som du vil, der kører alle brugerne igennem. for hver bruger skal du tjekke om tiden nu minus ti minutter er større end den tid de loggede på. Altså om den enkelte brugers logontid er større end $nutid.

Hvis den er det er de stadig logget på, hvis ikke logontid er større end $nutid så er han/hun logget af.

5. Stadig inde i din løkke hvor du kører brugerne igennem skal du nu lave en funktion der kan opdaterer din database. Her skal du lave en if sætning som tjekker om brugeren logontid er større end $nutid, og så derefter lægge det ind i databasens loggetind felt.

6. Så gemmer du den nye php side som admlogin.php, og lægger den ind i samme mappe som dit login system. Sørg for at inkluderer admlogin.php på så mange sider som muligt hvis ikke du har en cronjob mulighed. (CronJobs kan du læse om her http://en.wikipedia.org/wiki/Cronjobs). Du kan inkluderer ved at bruge php's interne funktion include(relativ url);

Eksempel på kode:
include("admlogin.php");


7. Derefter kan du på enhver server-side baseret side tjekke om en bestemt bruger er online bare ved at kigge i din database.

// Hvis det var lidt forvirrende med al den tekst for du lige noget eksempel med kode til din admlogin.php:

<?php
$minutter = 10;
$nutid = time() - (60 * $minutter);

// Husk at oprette forbindelse til din database før dette kodestykke
$query = mysql_query("SELECT * FROM brugere");
    $time = time();
    $nutime = $time - (60*$minutter);
    while($row = mysql_fetch_assoc($query))
    {
        if($row['brugernavn'] == $_SESSION['username'])
        {
            if($row['logontid'] > $nutid)
            {
                mysql_query("UPDATE brugere SET logontid='".$time."' WHERE brugernavn = '".$_SESSION['username']."'") OR DIE(mysql_error());
                mysql_query("UPDATE brugere SET loggetind='1' WHERE brugernavn = '".$_SESSION['username']."'") OR DIE(mysql_error());
            }else{
               
                mysql_query("UPDATE brugere SET loggetind='0' WHERE brugernavn = '".$_SESSION['username']."'") OR DIE(mysql_error());
                session_destroy();
            }
        }
    }
?>

Husk at rette følgende i ovenstående kode:
$_SESSION['username'] til den session som du bruger
Husk også at rette al SQL forespørgsel kode, som jeg går ud fra du kan.


Hvis du ikke bruger MySql kan du bruge dette som inpirations kilde til din admlogin.php:

<?php
        $time = time();
    $etime = $time - (60*10);
    $fil = file("brugere.inc");
    for($i=0;$i<count($fil);$i++)
    {
        $cuttet = $fil[$i];
        $side = explode("|",$cuttet);
        if($side[1] > $etime)
        {
        // Logget ind
        }else{
                // Logget af
        $filen = file_get_contents("brugere.inc");
        $filen = str_replace($fil[$i],"",$filen);
       
        $fope = fopen("brugere.inc","w");
        fwrite($fope,$filen);
        fclose($fope);
        }
    }
?>

Jeg håber du kunne bruge det ;)
Avatar billede mbm2016 Nybegynder
06. august 2009 - 18:39 #3
Hehh der var en der kom før mig :)
Avatar billede jenz3n Nybegynder
06. august 2009 - 18:47 #4
mbm2007, vi bruger samme princip, men din måde at loope over alle brugere ville jeg aldrig anbefale. En database med 10.000+ brugere ville jo blive ekstremt belastet, hvis du vil lave en løkke over dem hver eneste gang en side bliver loaded :P

Det virker også en smule overflødigt, da man kan få mySQL til at lave arbejdet ved at lave en UPDATE ... WHERE logontid > $nutid.
Men jeg ville stadig spare den kolonne væk, ved blot at tjekke online usere på dem der har lastActivity over time() - 300.
Avatar billede mbm2016 Nybegynder
06. august 2009 - 21:31 #5
Jeg regner ikke med han skulle bruge mege mere end noget der kunne kører med et par hundrede brugere hvis ikke mindre, han har ikke nævnt firma eller noget :=D
Avatar billede jenz3n Nybegynder
06. august 2009 - 21:38 #6
hehe, derfor er det stadig meget dårlig practice :P Og du kan jo gøre nøjagtig det samme med en SQL, det er endda nemmere at lave :P
Avatar billede goofysite Nybegynder
07. august 2009 - 11:41 #7
Mange tak for svarene begge 2..:D
I har begge været til en stor hjælp, så er det så den der kom først der skal have point, eller kan man dele dem? (Er ikke så vandt herinde ;-) )
Avatar billede jenz3n Nybegynder
07. august 2009 - 13:38 #8
Du kan godt dele dem, det er helt op til dig.
Avatar billede mbm2016 Nybegynder
10. august 2009 - 12:58 #9
Hvis du skal bruge et svar :)
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