Avatar billede BTEngineer Novice
22. september 2007 - 21:00 Der er 23 kommentarer og
1 løsning

Online status i brugersystem

Hej :-)

Jeg har lavet et brugersystem hvor de forskellige brugere skal kunne se om fx. deres venner er Online.

Er de Online skal det stå med grøn skrift i deres profil - Og er de derimod Offline, skal det stå med rød.

Når de logger ind skriver jeg:
mysql_query("UPDATE user SET status='online' WHERE username='$_SESSION[username'");

Og hvis de så de trykker "log af", benytter jeg den samme kode hvor den så sætter status til Offline.

Men hvis nu de lukker siden, så bliver det ikke opdateret og de vil stadig stå som Online.
Er der nogen der har en løsning på det?

Og lige en anden ting - Er det muligt at lave sådan, at brugeren ikke får lukket sin session efter de ca. 20 min?
Løsningen må meget gerne være en, hvor man sparer lidt på forespørgelserne - Men min database kan klarer meget da jeg ikke er decideret hostet hos en udbyder, men på en server kun til mit site.

Tak på forhånd :-)
Avatar billede coderdk Praktikant
23. september 2007 - 00:42 #1
Har lige haft et spm om det: http://www.eksperten.dk/spm/796128
Avatar billede coderdk Praktikant
23. september 2007 - 00:44 #2
Hvis det kun er antal online brugere der er logget ind, er det nemmere. Så opdaterer du bare et felt i brugertabellen med et tidsstempel, når de laver noget. Antallet af online kan du så definere til dem der f.eks. har foretaget sig noget inden for de sidste 5 minutter...
Avatar billede BTEngineer Novice
23. september 2007 - 10:16 #3
Kan du prøve at forklarer det med noget kode også - Har lidt svært ved at overskue det lige nu ;P
Avatar billede coderdk Praktikant
23. september 2007 - 13:00 #4
Hvis det blot er folk der er logget ind, kan du i toppen af alle sider lave:

<?php

  session_start();
  if ( isset( $_SESSION['user_id'] )
  {
    $sql = "UPDATE user SET sidste_aktivitet = UNIX_TIMESTAMP() WHERE userid = $_SESSION[user_id]";
    //udfør query
  }

For at få antallet af online brugere, som vi kan definere som folk der har lavet noget inden for 5 minutter:

$sql = "SELECT COUNT(userid) AS antal_online FROM user WHERE sidste_aktivitet + 300 > UNIX_TIMESTAMP()";
Avatar billede BTEngineer Novice
23. september 2007 - 13:28 #5
Hvad vil du have mig til at skrive ved 'udfør query' - Er ikke helt med ;P
Jeg vil gerne have at folk kan se om deres venner i brugersystemet er online.

Eksempel:
Brugernavn: Dounie
Bopæl: Midtjylland
Status: Online

- Du må meget gerne forklarer koden - Har ikke rigtig forstået hvorfor der står + 300 og UNIX_TIMESTAMP() - Er godt klar over det er en tid.

Men vil gerne lære noget af mine spørgsmål :)
Avatar billede coderdk Praktikant
23. september 2007 - 14:22 #6
Udfør query skal bare connecte til databasen og fyre SQL'en af med mysql_query ;P

Jeg har bare defineret at man er online, hvis man har foretaget sig noget på siden, inden for de sidste fem minutter... 300 sek = 5 minutter - Altså hvis feltet sidste_aktivitet indeholder et UNIX timetamp som er højere end det den aktuelle tid, hvis du adderer 300
Avatar billede BTEngineer Novice
23. september 2007 - 16:04 #7
Har forsøgt mig med:
<?
session_start();
if(isset($_SESSION[username]) AND isset($_SESSION[password])) {

include("../../inc/cfg.php");

if(isset($_SESSION[username])) {
    $sql = "UPDATE user SET lastactivity = UNIX_TIMESTAMP() WHERE username = '$_SESSION[username]'" or die(mysql_error());;
    $connect = mysql_fetch_array($sql);
  }

$load = mysql_query("SELECT * FROM user WHERE username = '$_SESSION[username]'") or die(mysql_error());
$show = mysql_fetch_array($load);
?>

<html>

<head>

<title>Logget ind!</title>
<link rel="stylesheet" href="../stylesheet/standard.css" type="text/css" />

</head>

<body>

<table border="0" width="100%">
    <tr>
        <td>Hej <b><? echo ucfirst($show['name']); ?> <? echo ucfirst($show['lastname']); ?></b></td>
    </tr>
    <tr>
        <td><a href="post/index.php" target="main">Post</a></td>
    </tr>
    <tr>
        <td><a href="profile.php?id=<? echo $show['id']; ?>" target="main">Min profil</a></td>
    </tr>
</table>

<?
$online_users = "SELECT COUNT(username) AS antal_online FROM user WHERE lastactivity + 300 > UNIX_TIMESTAMP()" or die(mysql_error());
$show_users = mysql_fetch_array($online_users);

echo "Der er $show_users[username] online";
?>
       
</body>

</html>

<?
mysql_close();
} else {
    include("no_access.php");
}
?>
------------------------------------------------------------------------------
Det er den side brugerne kommer til, når de har logget ind.

jeg får fejlene:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/public_html/test/user/access_user.php on line 9
Hej Henrik Nielsen
Post
Min profil

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/public_html/test/user/access_user.php on line 41
Der er online

I databasen har jeg lavet 2 felter.
'lastactivity' og 'bstatus' som er den som skal sættes til online eller offline.
Under loginet bliver den opdateret til Online - Så skal den bare sættes til Offline hvis de logger ud, eller hvis de lukker siden (ikke er aktiv i 5 min).
Avatar billede coderdk Praktikant
23. september 2007 - 16:21 #8
Du kalder mysql_fetch_array uden at kalde mysql_query
Avatar billede BTEngineer Novice
23. september 2007 - 16:59 #9
<?
session_start();
if(isset($_SESSION[username]) AND isset($_SESSION[password])) {

include("../../inc/cfg.php");

if(isset($_SESSION[username])) {
    $sql = mysql_query("UPDATE user SET lastactivity = UNIX_TIMESTAMP() WHERE username = '$_SESSION[username]'") or die(mysql_error());
    $connect = mysql_fetch_array($sql);
  }

$load = mysql_query("SELECT * FROM user WHERE username = '$_SESSION[username]'") or die(mysql_error());
$show = mysql_fetch_array($load);
?>

<html>

<head>

<title>Logget ind!</title>
<link rel="stylesheet" href="../stylesheet/standard.css" type="text/css" />

</head>

<body>

<table border="0" width="100%">
    <tr>
        <td>Hej <b><? echo ucfirst($show['name']); ?> <? echo ucfirst($show['lastname']); ?></b></td>
    </tr>
    <tr>
        <td><a href="post/index.php" target="main">Post</a></td>
    </tr>
    <tr>
        <td><a href="profile.php?id=<? echo $show['id']; ?>" target="main">Min profil</a></td>
    </tr>
</table>

<?
$online_users = mysql_query("SELECT COUNT(username) AS antal_online FROM user WHERE lastactivity + 300 > UNIX_TIMESTAMP()") or die(mysql_error());
$show_users = mysql_fetch_array($online_users);

echo "Der er $show_users[username] online";
?>
       
</body>

</html>

<?
mysql_close();
} else {
    include("no_access.php");
}
?>
----------------------------------------------------------------------------
Får stadig fejlen:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/public_html/test/user/access_user.php on line 9
Avatar billede coderdk Praktikant
23. september 2007 - 17:55 #10
Du skal ikke kalde fetch_array ved en update - Den returerer jo ikke noget
Avatar billede BTEngineer Novice
23. september 2007 - 19:07 #11
Nej - Det rigtig.
Får godt nok ikke nogle fejl nu, men der står ikke hvor mange der er Online.
Der står ik noget tal.
Avatar billede coderdk Praktikant
23. september 2007 - 19:59 #12
echo "Der er $show_users[username] online";

skal vel også være

echo "Der er $show_users[antal_online] online";
Avatar billede BTEngineer Novice
23. september 2007 - 21:25 #13
Det virker :).
Men hvordan får jeg så det vist, så man kan se om den enkelte bruger er online eller offline? Og er det muligt at lave sådan at ens sessions ikke "går ud" efter de ca. 20 min?
Avatar billede coderdk Praktikant
23. september 2007 - 21:58 #14
Samme princip - Brugeren er online hvis lastactivity + 300 > UNIX_TIMESTAMP, eller i php: $online = ( $show_user['lastactivity'] + 300 > time() );

Hvad mener du "går ud" efter 20 min?
Avatar billede BTEngineer Novice
23. september 2007 - 22:30 #15
$online_test = mysql_query("SELECT username AS online FROM user WHERE lastactivity + 3600 > UNIX_TIMESTAMP() AND id='$_GET[id]'") or die(mysql_error());
$online_user = mysql_fetch_array($online_test);

if($online_user[online] == NULL) {
$statusprofile = "Online";
} else {
$statusprofile = "Offline";
}

Det er virker ikke helt som jeg har lavet det - Jeg står som offline, men er online.

Altså har man været inaktiv i ca. 20 min. bliver ens sessions deaktiveret dvs. man er logget ud af systemet - Er det muligt at lave en uendelig session?
Avatar billede xsix Nybegynder
24. september 2007 - 01:31 #16
Mener ikke man kan lave en session der varer evigt, men du kan via cookies lave et der varer i et par år vist nok. :)
Avatar billede xsix Nybegynder
24. september 2007 - 02:12 #17
$online_test = mysql_query("SELECT username AS online FROM user WHERE lastactivity + 3600 > UNIX_TIMESTAMP() AND id='$_GET[id]'") or die(mysql_error());

Skal være:

$online_test = mysql_query("SELECT username AS online FROM user WHERE lastactivity + 3600 < UNIX_TIMESTAMP() AND id='$_GET[id]'") or die(mysql_error());

Så skulle du være online ;)

Med hensyn til session, kan du lave det i en cookie ved at skrive:

// Sætter din cookie til 86400 sekunder eller 1 dag (eller 31536000 sekunder for 1 år)
session_set_cookie_params(86400);
session_start();
Avatar billede xsix Nybegynder
24. september 2007 - 02:14 #18
Hov, du skal ikke gøre det jeg lige skrev :S
Mit hoved kan ikke lige tænke klart på den her tid.

Men det med cookien burde virke.
Avatar billede xsix Nybegynder
24. september 2007 - 02:32 #19
Sådan nu fandt jeg ud af det :P
Du skal bare ind og ændre i din database, så at datatypen bliver til double.
Det virkede ihvertfald for mig :)
og så skal du bruge time() i stedet for UNIX_TIMESTAMP() i dit query
Avatar billede BTEngineer Novice
25. september 2007 - 13:32 #20
Xsix ->
Den med at vende '<' tegnet, virkede.

Skal session_set_cookie_params(); så sættes på alle sider?
- Det skal session_start(); vel også, da brugerne også skal kunne bevæge sig rundt på de sider, gæsterne på siden også bevæger sig rundt på?

Med hensyn til session_set_cookie_params, er der så ikke problemer med tilladelse af cookies m.m.? Og hvad gør denne funktion egentlig?
Avatar billede xsix Nybegynder
25. september 2007 - 18:10 #21
Ja men hvis du vender '<' om, så viser den dig som online også selv om du er offline :P Derfor jeg lige rettede det.

men ja, session_start(); skal være på alle sider, jo der er problemer hvis der er en bruger som ikke tillader cookies, så kan han ikke benytte sig af sidens funktioner.
Jeg er ikke helt klar over hvad funktionen rent faktisk gør, men jeg tror bare at den gemmer sessionen på brugerens computer. (men prøv at søg på google eller herinde efter det)
Avatar billede BTEngineer Novice
25. september 2007 - 18:14 #22
Hvad mener du? Det virker udmærket, når jeg er logget ind, er jeg Online og når jeg logger ud er jeg Offline (også selvom jeg lukker siden).

Okay :-)
Avatar billede BTEngineer Novice
03. april 2008 - 16:48 #23
ikke mere hjælp åbenbart.
Avatar billede coderdk Praktikant
03. april 2008 - 18:29 #24
Jamen selv tak så :P
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