[PHP & MySQL] Current users online

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Bij heel veel sites op internet is er een lijst waarop je kan zien wie er momenteel online zijn. Ik weet wel hoe je een naam in zo'n lijst krijgt (bijv. bij het inloggen, wordt je naam in een tabel geplaatst). Maar ik vraag me altijd af hoe je naam er weer uit wordt gehaald, en wanneer. Want als je het venster sluit, staat je naam nog steeds in de tabel.

Hoe los je zoiets op? Oftewel, hoe doen al die sites dat?

Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

De waardes voor een bepaalde tijd in de table laten staan, een timestamp meegeven bijvoorbeeld.

Of gewoon in een normale user-table een 'last-hit' bijhouden, en als die minder dan X seconden geleden is, is die user online. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat zijn inderdaad wel goeie oplossingen. Maar hoe werkt zo'n timestamp precies?

Acties:
  • 0 Henk 'm!

  • MJV
  • Registratie: Mei 2003
  • Laatst online: 22:50

MJV

Verwijderd schreef op 05 juli 2004 @ 13:33:
Dat zijn inderdaad wel goeie oplossingen. Maar hoe werkt zo'n timestamp precies?
Met mktime() maak je van het aantal dagen, seconden, minuten, maanden, jaren een zgn. unix timestamp van de tijd.

Die unix timestamp is het aantal seconden van 1 Januari 1970 tot nu.

Met de functie date() kun je vervolgens een unix timestamp weer omzetten naar een menselijk leesbare datum, maar dat heb je niet nodig in dit geval.

Acties:
  • 0 Henk 'm!

Verwijderd

Zelf gebruik ik dit scriptje (wel een beetje aangepast), en ik ben er best tevreden mee :)
http://www.phpfreakz.nl/library.php?sid=11279

Verder kan je ook een "WIE" lijst gebruiken, als je daar meer over wilt weten moet je gewoon ff googlen :)

Acties:
  • 0 Henk 'm!

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
Mischien kan je hier wat mee:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?
session_start();

class sessions
{
    function sessions()
    {
        $this->check_timeout();
        
        $this->session_update();
    }
    function check_timeout()
    {
        global $dbm;
        
        $interval   = time() - 600;
        
        // delete alles dat al 600 seconden niet actief is geweest
        $dbm->query("DELETE FROM sessions WHERE ses_last < '". $interval ."'");
    }
    function session_update()
    {
        global $dbm;
        
        if($_SESSION['update'] < time() - 30) // update maar 1x in de 30 seconden (tegen overbelasting mysql, meer voor grote sites met veel visitors)
        {
            $_SESSION['update'] = time();
            
            $dbm->query("UPDATE sessions SET ses_last = '". time() ."' WHERE m_id = '". $_SESSION['user']['id'] ."'", 'sessions');
            if(mysql_affected_rows() == 0)
            {
                // de session rij is al gedelete (user mischien 15 min nergens geklikt), maar nieuwe session aan
                $this->session_add();
            }
        }
    }
    function session_add()
    {
        global $dbm, $_IN;
        
        if(empty($_IN['node']))
            $_IN['node']    = "news";
        
        $dbm->query("INSERT INTO 
                        sessions
                     VALUES
                     (
                     '',
                     '". $_SESSION['user']['id'] ."',
                     '". session_id() ."',
                     '". time() ."',    // start time
                     '". time() ."',    // last click
                     )", 'sessions');
    }
}
?>

www.dannyhiemstra.nl


Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 19-09 09:59
chuxiej schreef op 05 juli 2004 @ 16:39:
Mischien kan je hier wat mee:
....
Handig inderdaad, zonder DB-model. En zonder $dbm afhankelijke class.

[ Voor 10% gewijzigd door zeroxcool op 05-07-2004 19:31 ]

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

ZeRoXcOoL schreef op 05 juli 2004 @ 19:31:
[...]

Handig inderdaad, zonder DB-model. En zonder $dbm afhankelijke class.
Maar je kan het idee erachter wel prima begrijpen aan de hand van die class? Dit is ook niet echt een topic dat voldoet aan de eisen die er aan gesteld worden in P&w omdat ie niet verteld wat ie zelf geprobeerd heeft enzo.

Misschien dit even lezen:
P&W Beleid

[ Voor 11% gewijzigd door Brakkie op 05-07-2004 20:28 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
ZeRoXcOoL schreef op 05 juli 2004 @ 19:31:
[...]

Handig inderdaad, zonder DB-model. En zonder $dbm afhankelijke class.
Het was niet mijn idee om een kant en klare class en database tabel voor m te gaan maken maar gewoon een idee of mischien een begin.

www.dannyhiemstra.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi, heel erg bedankt voor alle replies! Ik weet nu wat ik ongeveer moet scripten. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb um zelf ook even gemaakt na het voorbeeld van hierboven.... kijk maar wat jullie er mee doen...

Maar 80 regels incl comments...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?

session_start();

/*
CREATE TABLE `online` (
  `session_id` varchar(128) NOT NULL default '',
  `time_start` bigint(20) NOT NULL default '0',
  `time_change` bigint(20) NOT NULL default '0',
  KEY `session_id` (`session_id`)
) TYPE=MyISAM;
*/

// om de hoeveel minuten moet ik oude records verwijderen.
$cleartime  = time() - 600;
// om de hoeveel tijd moet ik deze gebruiker updaten!?
$updatetime = time() - 30;

@mysql_connect("****",
               "****",
               "****") or die('no connection to the sql server could be made');
@mysql_select_db("onlineusers") or die("Sorry database not found..");


$insert = "INSERT INTO
                `online` (`session_id`, `time_start`, `time_change`)
           VALUES
                ('" . session_id() . "',
                 '" . time() . "',
                 '" . time() . "');";
$update = "UPDATE
                `online`
           SET
                `time_change` = '". time() ."'
           WHERE
                `session_id` = '" . session_id() . "'";
$clear = "DELETE FROM
              `online`
          WHERE
              `time_change` < '" . $cleartime . "'";

$stats = "SELECT
              count(session_id)
          FROM
              `online`";

if (isSet($_SESSION['online']))
{
    if ($_SESSION['online'] < $updatetime)
    {
        $_SESSION['online'] = time();

        // probeer de gebruiker te updaten.
        mysql_query($update);
        if(mysql_affected_rows() == 0)
        {
            // sessie is waarschijnlijk verwijderd, maak nieuwe aan.
            mysql_query($insert);
        }
        
        // ruim users op die al een tijd inactief zijn.
        mysql_query($clear);
    }
}
else
{
    $_SESSION['online'] = time();

    // voeg nieuwe gebruiker toe in de statistieken
    mysql_query($insert);
}


// testje om te kijken hoeveel gebruikers er online zijn.
$query = mysql_query($stats);
$users = mysql_result($query, 0);

echo 'er zijn in totaal (' . $users . ') online...';

?>


verander zelf even de mysql gegevens en zet de database er even in... klaar is kees

[ Voor 10% gewijzigd door Verwijderd op 06-07-2004 02:53 ]

Pagina: 1