Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:37 Der er 35 kommentarer og
1 løsning

Online / ofline system

Jeg har gået og tænk meget længe over hvordan man kan lave et online / ofline system
til mit brugersystem så man kan se om de er online eller ofline
nogen der kan hjælpe mig med det ?
Avatar billede jaw Nybegynder
11. juli 2005 - 23:40 #1
Smid personen i en online-tabel i en MySQL-database når han logger på, og slet ham hvis han er offline i f.eks. 5-10 minutter...
Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:41 #2
jamen hvordan kan man lige lave det så han bliver smidt over i en offline
Avatar billede jaw Nybegynder
11. juli 2005 - 23:41 #3
Det er vel sådan set bare udelukkelses-metoden? Hvis ikke han er i online, så er han jo nok offline :)
Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:42 #4
ja men hvordan kan man lave så hvis han ikke er inde på siden så den selv logger ud efter 5 min :)
Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:42 #5
hvis han ikke trykker logaf inden han går
Avatar billede wuggawugga Nybegynder
11. juli 2005 - 23:44 #6
Hvis du bruger en database baseret session handler, kan du med fordel indbygge online/offline tracking deri, så status bliver opdateret sammen med session information
Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:45 #7
wuqqawuqqa hvordan kan jeg bygge det ind i session
Avatar billede jaw Nybegynder
11. juli 2005 - 23:46 #8
Sådan her f.eks., så vil den slette alle fra databasen, der ikke har været aktive i 5 minutter...

mysql_query("DELETE FROM tabel WHERE date_add(feltnavn,interval 5 MINUTE) < NOW()");
Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:47 #9
hmm det skal så stå i index filen ikke?
og så skal jeg lave en tabel som hedder status eller et eller andet ikk?
Avatar billede wuggawugga Nybegynder
11. juli 2005 - 23:54 #10
Du skal bruge funktionen session_set_save_handler()
    bool session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)

Manual siden har et udmærket eksempel på, hvordan du bygger en fuld session handler. Hver parameter til funktionen er navten på en funktion du selv har skrevet, der udfører en enkelt handling på en session (åbn, luk, læs, skriv, slet og ryd op)
Hvis du hellere vil have det samlet i et objekt, kan jeg give dig noget af mit kode, som du kan bruge.
Du kan indsætte dine brugeroplysninger for online brugere, i samme funktion som den du bruger til at oprette en session, og du kan f.eks. sætte dem offline i garbage collection funktionen. Du kan desuden styre hvor længe en session skal vare, og hvor ofte garbage collection funktionen skal køres.
Jeg skal forresten lige tilføje at det ikke er nødvendigt at bruge databasen til sessions for at det her skal virke. Du kan sagtens bruge filer, eller memcache hvis du er lidt fancy ;)
Avatar billede jaw Nybegynder
11. juli 2005 - 23:57 #11
Jow, det er klart at du på alle sider skal have en fil, der først indsætter brugerens navn og tidpunkt, hvis han ikke er i tabellen allerede, og dernæst sletter med førnævnte linie dem der har været inaktive.
Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:57 #12
forstår ikke så mget af alt det der :D men lyder godt hvis man kunne hehe
Avatar billede mr-xmas Nybegynder
11. juli 2005 - 23:58 #13
syntes ikke det er så nemt at lave er det bare mig eller lyder det svært :(
Avatar billede wuggawugga Nybegynder
11. juli 2005 - 23:58 #14
Hvis du har mange brugere/hits, vil det blive tungt at opdatere databasen hver gang, hvilket ville ske hvis du bare satte det ind i index.php
Men du kan jo blande et eller andet tilfældigheds noget ind i det, så databasen kun bliver opdateret en gang imellem.

Jeg har i mine systemer altid en tabel der hedder noget i stil med online_users hvor jeg kun gemmer bruger id, og tidspunktet for brugerens sidste handling.
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 00:00 #15
Jeg havde selv lidt svært ved at få det hele til at spille den første gang jeg rodede med det, men det er egentligt ret simpelt, og som jeg ser det, noget alle får bruger for før eller senere ;)
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 00:00 #16
wuggawugga kan du prøve at komme med en kode

eller jaw kan du prøve at vise hvordan den skal funke helt
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 00:10 #17
Jo jeg har lidt kode her

http://pastebin.com/311526

Det skal dog siges at jeg i mit eget system sætter brugere online i en anden klasse, som udelukkende er til brugervalidering.
Jeg har også lidt genvejsfunktioner og konstanter, så det er ikke noget der bare virker uden tilpasning.
Jeg bruger desuden PHP5 og Postgres :)
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 00:13 #18
skal hele den kode  der sættes i index?
Avatar billede jaw Nybegynder
12. juli 2005 - 00:34 #19
Mit bud ville være noget a'la:

    if(isset($_SESSION['brugernavn']) && !empty($_SESSION['brugernavn'])) {
           
        $q = mysql_query("
            SELECT *
            FROM tabel
            WHERE `brugernavn` = '".$_SESSION['brugernavn']."'
        ");
   
        if(mysql_num_rows($q) == 0) {
          mysql_query("
              INSERT INTO tabel (tid, brugernavn)
              VALUES (NOW(),'".$_SESSION['brugernavn']."')
          ");
        } else {
          mysql_query("
              UPDATE tabel
              SET `tid` = NOW()
              WHERE `brugernavn` = '".$_SESSION['brugernavn']."'
          ");
        }
       
        mysql_query("
            DELETE FROM tabel
            WHERE date_add(tid,interval 5 MINUTE) < NOW()
        ");
    }

Muligvis det er lidt ressourcekrævende, og i hvert fald noget af det kan gøres mere smidigt, men det burde virke... Så skal det bare inkluderes i toppen af alle dine sider.
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 09:04 #20
Ja, scriptet skal inkluderes på alle sider. Det er ret vigtigt faktisk, fordi du ellers vil opleve at session variable opfører sig meget underligt.
Det er en klasse hvor al session håndtering er indkapslet, og det eneste du skal gøre er at skrive

$sessionHandler = new SessionHandler();

Så registrerer den sig selv som session handler, og så mangler du bare at fixe alle de fejl der garanteret kommer fordi klassen er lavet til mit eget system ;)
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 13:19 #21
jaw skal den bare se sådan ud og skulle det så virke :)?
<?php
include("dbconnect.php");
    if(isset($_SESSION['brugernavn']) && !empty($_SESSION['brugernavn'])) {
           
        $q = mysql_query("
            SELECT *
            FROM status
            WHERE `brugernavn` = '".$_SESSION['brugernavn']."'
        ");
   
        if(mysql_num_rows($q) == 0) {
          mysql_query("
              INSERT INTO status (tid, brugernavn)
              VALUES (NOW(),'".$_SESSION['brugernavn']."')
          ");
        } else {
          mysql_query("
              UPDATE status
              SET `tid` = NOW()
              WHERE `brugernavn` = '".$_SESSION['brugernavn']."'
          ");
        }
       
        mysql_query("
            DELETE FROM status
            WHERE date_add(tid,interval 5 MINUTE) < NOW()
        ");
    }
            ?>
Avatar billede jaw Nybegynder
12. juli 2005 - 17:40 #22
Ja, det skulle det vist være - men måske det er lettere at teste det end at spørge? :)
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 18:56 #23
har jeg os gjordt :P og det virker :) så send et svar :)
Avatar billede jaw Nybegynder
12. juli 2005 - 18:57 #24
Gør jeg da gerne :) Takker...
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 18:57 #25
det er da mig som takker :)
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 19:16 #26
jaw kan jeg ikke os lave så den går ind i tabelen users og laver om i en kollone ved brugeren hvis han er logget ind så den skriver online og offline hvis han ikke er for det vil jeg os gerne have lavet hvis det er mugligt ;D
Avatar billede jaw Nybegynder
12. juli 2005 - 19:18 #27
Tjoh, en løsning kunne jo være:

$q = mysql_query("SELECT * FROM status WHERE brugernavn = '".$_SESSION['brugernavn']."'");
if(mysql_num_rows($q) == 0) {
  echo "offline";
} else {
  echo "online";
}
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 19:20 #28
skal det stå i den fil den skal skrive om den er online eller offline
eller skal den stå samme sted som den anden kode?
Avatar billede jaw Nybegynder
12. juli 2005 - 19:21 #29
I den fil hvor du vil se om brugeren er online eller offline... Og så er den nok også forkert, for hvis det er en speciel bruger du vil se, så skal du ændre $_SESSION[...] til et andet variabelnavn der indeholder navnet på den bruger du vil se...
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 19:27 #30
ja jeg siger tak men ændrede bare lidt lidt i den så virker det :)
sådan ser koden ud nu
<?php
    $q = mysql_query("SELECT * FROM status WHERE brugernavn = '".$_GET['id']."'");
if(mysql_num_rows($q) == 0) {
  echo "Offline";
} else {
  echo "Online";
}
?>
ændrede det der session tiil $_GET['id']
Avatar billede jaw Nybegynder
12. juli 2005 - 19:28 #31
Jep, også præcis sådan jeg mente :) - selv tak...
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 19:29 #32
heh men mange tak :P
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 20:00 #33
kan man ikke lave så den os sletter en fra status hvis man trykker på logud :)?
Avatar billede jaw Nybegynder
12. juli 2005 - 20:01 #34
mysql_query("DELETE FROM status WHERE brugernavn = '".$_SESSION['brugernavn']."'");
session_destroy(); //eller hvordan du nu logger ud
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 20:13 #35
det virker os :)
Avatar billede mr-xmas Nybegynder
12. juli 2005 - 20:45 #36
hvad skal jeg så ændre ".$_GET['id']." til hvis det skal se's på en brugerliste?
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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