Avatar billede kelis Nybegynder
20. marts 2007 - 15:47 Der er 15 kommentarer og
1 løsning

Bruger online??

Hej eksperter,

Har tinychat på min side. På login siden ville jeg hvis det er muligt, gerne kunne vise hvem der er online lige nu. Jeg har brugt timer her på, at søge noget jeg kan bruge, jeg har da også fundet noget kode men det virker desværre ikke.
Jeg ved jeg skal have en function i chatbase.php og noget kode ind i login.php men hvad??  Håber I kan hjælp. Jeg har med vilje ikke postet chatbase og login da det vil fylde en del.

På forhånd tak
Kelis

Jeg har tabellen :

CREATE TABLE `tinychat_user` (
  `user_id` int(10) unsigned NOT NULL auto_increment,
  `user_name` varchar(24) collate latin1_danish_ci default NULL,
  `user_pass` varchar(32) collate latin1_danish_ci default NULL,
  `user_textcol` varchar(6) collate latin1_danish_ci default NULL,
  `user_namecol` varchar(6) collate latin1_danish_ci default NULL,
  `user_status` int(11) default '1',
  `user_lastlogin` int(11) default NULL,
  `user_lastcontact` int(11) default NULL,
  `user_lastip` varchar(15) collate latin1_danish_ci default NULL,
  PRIMARY KEY  (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=56 ;
Avatar billede kelis Nybegynder
21. marts 2007 - 11:43 #1
Hej igen

Ingen svar fra eksperterne, der kan kun være to muligheder...

1. I er ikke så kloge som jeg gik og troede når jeg læser jeres indlæg herinde?
2. I mener det er under jeres værdighed at svare på et spørgsmål om en chat??

Vælg selv;-)

Hilsen
Kelis;-)
Avatar billede j4k0b Nybegynder
21. marts 2007 - 15:14 #2
Jeg er for god og arrogant til at svare på spørgsmål, derfor kalder jeg mig selv ekspert :-) Nej, slap nu af...

Der er to måder at tjekke om en bruger er online på. Den kræver en live socket stream mellem bruger og server, og derfor en lille java klient installeret på brugerens computer, derfor undlader jeg at forklare den her.

Den anden er simpel nok:

Når en bruger logger ind eller skriver noget i din chat skal du gemme et tidsstempel for hvornår det skete. Med det kan du SELECT alle brugere, hvor tidsstemplet er mindre end X minutter gammel.

Eksempel på din SQL forespørgsel:

$sql = "SELECT user_id,user_name FROM tinychat_user WHERE last_activity_timestamp >= '".date('YmdHis', (time() - (4*60)))."'";
$result = mysql_query($sql) or die(mysql_error());

Ovenstående henter alle brugeren som har været aktive indenfor de sidste 4 minutter (4*60 sekunder). Feltet last_activity_timestamp skal være at typen DATETIME eller TIMESTAMP.

Jeg håber det er en hjælp.
Avatar billede kelis Nybegynder
23. marts 2007 - 10:17 #3
Hej j4k0b

Jo dit indlæg er en hjælp og tak for svar, jeg ved – har læst og søgt herinde i mange år, at i er eksperter. Det er jeg desværre ikke, men jeg prøver mig frem. Mit indlæg skal læses med et glimt i øjet;-) Jeg har en fil der kaldes chatbase.php hvor de forskellige funktioner er. Hvis jeg smider det her ind i chatbase, er det så rigtigt??  Og så skal jeg også bruge nogle if sætninger i login.php  da jeg gerne vil kunne vise på siden man logger ind på, hvor mange der er online..

En anden ting er, skal last_activity_timestamp  udskiftes med last_contact??? I strukturen på min tabel bruges last_contact?? Som du nok kan læse har jeg ingen forstand på alt det her kode noget..

På forhånd tak
kelis

<?

require("configuration.php");
{
function users_online()

$sql = "SELECT user_id,user_name FROM tinychat_user WHERE last_activity_timestamp >= '".date('YmdHis', (time() - (4*60)))."'";
$result = mysql_query($sql) or die(mysql_error());

}

?>
Avatar billede j4k0b Nybegynder
23. marts 2007 - 10:33 #4
> Jeg har en fil der kaldes chatbase.php hvor de forskellige funktioner er. Hvis jeg smider det her ind i chatbase, er det så rigtigt??

> Og så skal jeg også bruge nogle if sætninger i login.php  da jeg gerne vil kunne vise på siden man logger ind på, hvor mange der er online..

Det du spørger om er ligesom at ringe til en tømrer og spørge hvor meget det koster at total renoverer et hus uden at lade ham kigge på huset først :-) Jeg kender ikke chat systemet du bruger, så jeg kan ikke svare dig på det.


> En anden ting er, skal last_activity_timestamp  udskiftes med last_contact???

Hvis last_contact indeholder et tidsstempel, for hvornår brugeren sidst loggede ind eller skrev en besked på din chat, så ja.
Avatar billede kelis Nybegynder
23. marts 2007 - 11:43 #5
Hej j4k0b,

Jeg giver dig ret, du er  arrogant, men arrogante mennesker har også deres berettigelse;-) j4k0b hvis du laver et svar får du nogle point for din stilfulde måde, at være arrogant på…og den hjælp du trods alt kom med.

So far so good…

Hvis der er nogle der er knap så arrogante og som vil hjælpe med dette ville jeg blive glad..

Indtil videre har jeg dette med hjælp fra j4k0b  som skal ind i chatbase.php hvor alle funktionerne er.  Chatbase fylder meget, men hvis I har brug for at se den poster jeg den gerne.

Hvad skal der stå i login.php for at få vist online brugerne? Skal der ikke være nogle if sætninger?? Sig til hvis I har brug for, at se login.php

På forhånd tak
Kelis



<?
{
function users_online()

$sql = "SELECT user_id,user_name FROM tinychat_user WHERE user_lastcontact >= '".date('YmdHis', (time() - (4*60)))."'";
$result = mysql_query($sql) or die(mysql_error());

}

?>
Avatar billede kelis Nybegynder
24. marts 2007 - 17:38 #6
Hmmm, underligt...

Når jeg bruger nedenstående kode får jeg den her fejl, det pudsige er, at der IKKE står noget på linie 13 andet end ?> kan ikke lige greje den...nogen de rkan se fejlen?

Parse error: syntax error, unexpected $end in /usr/home/xxx/xxx/tester/brugeronline.php on line 13


<?
require("configuration.php");

{
function user_online()
{
$sql = "SELECT user_id,user_name FROM tinychat_user WHERE user_lastcontact >= '".date('YmdHis', (time() - (4*60)))."'";
$result = mysql_query($sql) or die(mysql_error());

}

?>
Avatar billede j4k0b Nybegynder
24. marts 2007 - 18:07 #7
Tjek efter at der er ; efter alle linier i filen og at du har husket at lukke alle paranteser og klammer: () og {}
Avatar billede kelis Nybegynder
24. marts 2007 - 18:44 #8
Tjekker og vender tilbage lidt senere...

j4k0b jeg begynder,at kunne lide dig;-)
Avatar billede kelis Nybegynder
24. marts 2007 - 18:57 #9
j4k0b,

Satte en ekstra } tilsidst...det hjalp næsten, nu er der ingen fejlmeldinger, men siden er hvid??

Nu ser koden sådan her ud og det er hele koden i filen brugeronline.php.

<?
require("configuration.php");

{
function user_online()
{
$sql = "SELECT user_id,user_name FROM tinychat_user WHERE user_lastcontact >= '".date('YmdHis', (time() - (4*60)))."'";
$result = mysql_query($sql) or die(mysql_error());

}
}
?>
Avatar billede j4k0b Nybegynder
25. marts 2007 - 14:16 #10
Hvorfor sætter du overhovedet klammer rundt om din funktion? Der hører de ikke til :D

Prøv med:

<?

require("configuration.php");

function user_online() {
    $sql = "SELECT user_id,user_name FROM tinychat_user WHERE user_lastcontact >= '".date('YmdHis', (time() - (4*60)))."'";
    $result = mysql_query($sql) or die(mysql_error());
}

?>
Avatar billede kelis Nybegynder
27. marts 2007 - 12:59 #11
Så har jeg næsten fået løst mit problem;-)

Bruger denne kode, men den viser ikke online bruger men derimod hvor mange der er oprettet!? Hvor er fejlen, jeg vil gerne have vist hvor mange der er online og IKKE hvor mange der er oprettet.

Et andet problem er også at bruges ovenstående kode indsættes en fiktiv bruger i tabellen, som kaldes NULL…..

j4k0b.....

Kan du finde den simple fejl for dig, men uløseligt for mig, er der 200 point til dig. Jeg er på nippet til at opgive, hvis ikke du kommer og redder mig;-)

<?php
$connection = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx");
$ip = getenv(REMOTE_ADDR);
$tid = date("Y-m-d H:i:s", (time()-600));


$tjek = mysql_query("SELECT * FROM tinychat_user where user_lastip='$ip'");
if(mysql_num_rows($tjek) == 0) {
    mysql_query("INSERT INTO tinychat_user (user_lastcontact, user_lastip) VALUES (now(),'$ip')");
} else {
    mysql_query("update tinychat_user set user_lastcontact=now() where user_lastip='$ip'");
}
$online = mysql_query("SELECT * FROM tinychat_user");
echo "Der er lige nu ".mysql_num_rows($online)."online";
mysql_close($connection);
?>
Avatar billede j4k0b Nybegynder
27. marts 2007 - 13:16 #12
> Et andet problem er også at bruges ovenstående kode indsættes en fiktiv bruger i tabellen, som kaldes NULL

Er det user_lastip som angives til NULL? Det kan muligvis skyldes at getenv(REMOTE_ADDR) ikke altid returnerer brugerens IP adresse. Jeg er ikke helt klar over hvorfor, eller hvordan det fungerer. Læs evt mere på http://dk.php.net/getenv/

Grunden til, at du får vist samtlige brugere i din database er at du ikke sætter nogle betingelser når du henter dem:

$online = mysql_query("SELECT * FROM tinychat_user");
echo "Der er lige nu ".mysql_num_rows($online)."online";

Prøv at ret ovenstående til:

$online = mysql_query("SELECT user_id FROM tinychat_user WHERE user_lastcontact >= '".$tid."'") or die(mysql_error());
echo "Der er lige nu ".mysql_num_rows($online)." chattere online";
Avatar billede kelis Nybegynder
27. marts 2007 - 14:10 #13
j4k0b,

Nu viser den online chattere, og opdatere også fint når nye logger på. Men der er et problem, når man logger af opdatere den ikke, dvs man bliver hængende som om man er online, og user_lastcontact ændres i databasen til 2007.

Den fiktive bruger NULL bliver ved med, at oprette sig selv, har prøvet at slette brugeren NULL i databasen. Det må være et eller andet i koden, der gør det. NULL får min IP adresse, får password og det hele, passwordet er også NULL...Men jeg kan ikke logge på chatten med NULL, underligt...

j4k0b,

Smid et svar, synes du har fortjent de point jeg er kommet et langt stykke videre ved din hjælp;-)

Hilsner
Kelis
Avatar billede j4k0b Nybegynder
27. marts 2007 - 14:22 #14
Nej, du kan ikke logge på med NULL da det ikke er en streng med en værdi der kan sammenlignes med input fra din login formular.. NULL er, jah hvordan skal man forklare det.. en værdi af ingenting :-)

Den viser ikke brugere der er online på chatten, men derimod brugere som har været aktive indenfor de sidste 600 sekunder. Hvis du vil fjerne brugere fra listen når de logger ud skal du også anføre et sted i din database om de er logget ind eller ej.

Jeg kan se at din tabel indeholder et felt der hedder user_status - hvad angiver dette felt? Er det en sand/falsk værdi for, om han er logget ind?

Hvis det er, så kan du tilføje dette til din SQL:

$online = mysql_query("SELECT user_id FROM tinychat_user WHERE user_lastcontact >= '".$tid."' AND user_status = '1'") or die(mysql_error());
echo "Der er lige nu ".mysql_num_rows($online)." chattere online";

Bemærk: user_status = '1' kan kun bruges hvis værdien af user_status er anivet til 1 når brugeren logger ind. Dette skal rettes til 0 (eller enhver anden værdi end '1') når brugeren logger ud.

Er det til at forstå? ellers kan jeg prøve at forklare det lidt bedre..
Avatar billede kelis Nybegynder
27. marts 2007 - 14:41 #15
j4k0b,

Tusinde tak for din hjælp, det virker perfekt nu ud fra det kode du har lagt bruger jeg det her, uden dig var det ikke lykkedes, tak for din tålmodighed:-)

Du får lige et forårs knus:-)

<?php
$connection = mysql_connect("xxx", "xxx", "xxx");
mysql_select_db("xxx");
$tid = date("Y-m-d H:i:s", (time()-300));

$online = mysql_query("SELECT user_id FROM tinychat_user WHERE user_lastcontact >= '".$tid."'") or die(mysql_error());
echo "Der er lige nu ".mysql_num_rows($online)." chattere online";
mysql_close($connection);
?>
Avatar billede kelis Nybegynder
27. marts 2007 - 14:43 #16
Glemte lige at fortælle, at brugeren NULL er også væk;-)

Ha en god sommer
Kelis
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