Avatar billede human Nybegynder
28. april 2004 - 14:44 Der er 16 kommentarer og
1 løsning

users online script

Heysa!

Jeg har lavet dette lille script:

if(!session_is_registered('online')){
    @mysql_query("INSERT INTO du_users_online (session_id, activity, ip_address, refurl, user_agent)        VALUES ('".session_id()."', NOW(), '{$_SERVER['REMOTE_ADDR']}', '{$_SERVER['HTTP_REFERER']}', '{$_SERVER['HTTP_USER_AGENT']}')");
    session_register('online');
} else {
    if(session_is_registered('username')){
        @mysql_query("UPDATE du_users_online SET activity=NOW(), member='y' WHERE session_id='".session_id()."'");
    }
}
if(session_is_registered('online')){
    @mysql_query("UPDATE du_users_online SET activity=NOW() WHERE session_id='".session_id()."'");
}

og trækker det ud med:

$limit_time = time() - 60; // 60 * det antal minutter du vil have den skal opdatere
$sql = mysql_query("SELECT count(*) FROM du_users_online WHERE UNIX_TIMESTAMP(activity) >= $limit_time AND member='n' GROUP BY ip_address") or die (mysql_error());
$sql_member = mysql_query("SELECT count(*) FROM du_users_online WHERE UNIX_TIMESTAMP(activity) >= $limit_time AND member='y' GROUP BY ip_address") or die (mysql_error());
$visits = mysql_num_rows($sql);
$members = mysql_num_rows($sql_member);

Og udskriver så bare $visits og $members.

Men nu vil jeg gerne udvide det, så man kan se hvilke burgere der er online, men kan ikke lige se hvordan det skal gøres. brugernavnet skal komme fra en $_SESSION['username'];, eller hvis du har andre ideer er det self også okay.

Kan du hjælpe med dette? :)
Avatar billede riversen Nybegynder
28. april 2004 - 15:05 #1
det er vel "bare" hver gang en bruger laver aktivitet at gemme tiden for dette i databasen... hvad er det nøjagtig du er i tvivl om?
Avatar billede human Nybegynder
28. april 2004 - 15:11 #2
Hvordan jeg får $_SESSION[username] smidt i db'en. Hvis det er det eneste som skal til, hvilket jeg ikke er sikker på.

Har prøvet at gøre således:
if(!session_is_registered('online')){
    @mysql_query("INSERT INTO du_users_online (session_id, activity, ip_address, refurl, user_agent, username)        VALUES ('".session_id()."', NOW(), '{$_SERVER['REMOTE_ADDR']}', '{$_SERVER['HTTP_REFERER']}', '{$_SERVER['HTTP_USER_AGENT']}','{$_SESSION['username']}')");
    session_register('online');
} else {
    if(session_is_registered('username')){
        @mysql_query("UPDATE du_users_online SET activity=NOW(), member='y' WHERE session_id='".session_id()."'");
    }
}
if(session_is_registered('online')){
    @mysql_query("UPDATE du_users_online SET activity=NOW() WHERE session_id='".session_id()."'");
}

Og selvfølgelig oprettet feltet i tabellen, men den vil ikke smide navnet i $_SESSION i tabellen. Tror det er der problemet ligger. Skal siges den ikke kommer med fejl eller andet, den gør det bare ikke.
Avatar billede riversen Nybegynder
28. april 2004 - 15:13 #3
prøv at lave en udskrift af din SQL for at se syntaksen... evt. tilføj or die( "Fejl: " mysql_error() ) efter hver query istedet for @ først
Avatar billede human Nybegynder
28. april 2004 - 15:18 #4
Så får jeg:
Duplicate entry 'a34800b8da060877d91300f80e91fcaf' for key 1

min tabel:
CREATE TABLE du_users_online (
  session_id varchar(255) NOT NULL default '',
  activity datetime NOT NULL default '0000-00-00 00:00:00',
  member enum('y','n') default 'n',
  ip_address varchar(255) NOT NULL default '',
  refurl varchar(255) NOT NULL default '',
  user_agent varchar(255) default NULL,
  username varchar(25) NOT NULL default '',
  PRIMARY KEY  (session_id),
  KEY session_id (session_id)
) TYPE=MyISAM;

Er det fordi username rent faktisk er mit session_id? Eller hvad sker der?
Avatar billede Slettet bruger
28. april 2004 - 15:20 #5
Det er fordi session_id er en primary key.

Du skal formodentlig skifte INSERT INTO med UPDATE hvis brugeren allerede findes, gætter jeg på.
Avatar billede human Nybegynder
28. april 2004 - 15:23 #6
Hmm.. eksempel?
Avatar billede Syska Mester
28. april 2004 - 15:48 #7
hvis det du kan lave det andet, kan du vel også lave noget ser updater en MYSQL db
Avatar billede human Nybegynder
28. april 2004 - 16:11 #8
sure.. Men ved ikke hvad han mener eller hvor han mener. Vidste jeg hvad problemet var havde jeg ikke spurgt.
Avatar billede Slettet bruger
28. april 2004 - 18:21 #9
Du får en duplicate entry fejl fordi du ikke kan sætte det samme session_id ind i et row der allerede ejer det session_id, fordi session_id er en Primary Key. (Dvs unik - og så må der ikke være to ens)
Avatar billede riversen Nybegynder
28. april 2004 - 18:25 #10
buzzzz: hvordan hjælper din kommentar lige human?
Avatar billede human Nybegynder
28. april 2004 - 18:53 #11
pacr00n: Ja det er jeg klar over..
Men har ikke lige en ide til hvordan det forhindres, og scriptet stadig virker.

Ved logout lavede jeg en query hvor den slettede session_id der var = session_id. Og det fungerede fint, men nytter jo selvfølgelig ikke noget hvis brugeren vælger at lukke browseren istedet for at logge ud.
Så det er jo det første problem der skal løses før problemet med $_SESSION['username'] kan løses...
Avatar billede Slettet bruger
28. april 2004 - 23:02 #12
Jeg troede rent faktisk at sessions blev afsluttet hvis browseren blev lukket - men det gør den så åbenbart ikke. - You got me...
Avatar billede riversen Nybegynder
29. april 2004 - 07:36 #13
pacroon: jo, sessions afsluttes, når browseren lukkes.

human: når der kommer aktivitet på siden, skal du sørger for at der bliver ryddet op i databasen, så har du løst problemet med at folk ikke logger ud, og ikke bliver slettet i DB
Avatar billede human Nybegynder
29. april 2004 - 17:36 #14
Det vil sige.. At jeg skal lave en query, som er på alle sider, som tjekker at activity i db, er blevet ældre, end en session lever? Men hvor langtid lever en session, når man ikke har sat noget udløbstid på den?

Burde det ikke fungere?
Avatar billede human Nybegynder
29. april 2004 - 19:11 #15
Hmm.. Virker ikke hvis brugeren logger ind, lukker browseren, logger ind. Og session timeout så ikke er gået.

En der har et bedre forslag?
Avatar billede human Nybegynder
29. april 2004 - 21:25 #16
For svær en opgave? ;)
Avatar billede human Nybegynder
29. april 2004 - 21:30 #17
Lukket.
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