Jump to content
MK2

Script php to show online users

Recommended Posts

MK2

Oi..

Tenho uma dúvida.. Quero usar num site um sistema que me diga quantos utilizadores estão online e que tenha uma sessão.

Essa sessão expira em 1min só para testar.

O problema é que não está a expirar a sessão

<?php
session_start();
$session=session_id();
$time=time();
$time_check=$time-60; //SET TIME 1 Minute

$host="localhost"; // Host name
$username="root"; // Mysql username
$password="vertrigo"; // Mysql password
$db_name="test"; // Database name
$tbl_name="user_online"; // Table name

// Connect to server and select databse
mysql_connect("$host", "$username", "$password")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select DB");

$sql="SELECT * FROM $tbl_name WHERE session='$session'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count=="0"){
$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', '$time')";
$result1=mysql_query($sql1);
}
else {
$sql2="UPDATE $tbl_name SET time='$time' WHERE session = '$session'";
$result2=mysql_query($sql2);
}

$sql3="SELECT * FROM $tbl_name";
$result3=mysql_query($sql3);

$count_user_online=mysql_num_rows($result3);

echo "User online : $count_user_online ";

// if over 10 minute, delete session 
$sql4="DELETE FROM $tbl_name WHERE time<$time_check";
$result4=mysql_query($sql4);

echo "".$time_check."";

mysql_close();

// Open multiple browser page for result
?>

Funciona tudo... Cria a sessão, se fizer refresh à página ele actualiza a sessão, etc.. Só que passado o tempo, ele não expira...


Cumps;Mk2_______________________________________________Se não fosse o C estaríamos a usar Pasal, obol e Basi ...

Share this post


Link to post
Share on other sites
MK2

Peço desculpa.. Mas não consegui perceber o conteúdo do site...

A unica coisa que queria no outro código era que após o tempo ele eliminasse o registo na bd... E o que acontece é que ele pode estar um dia inteiro ligado que não elimina o registo....


Cumps;Mk2_______________________________________________Se não fosse o C estaríamos a usar Pasal, obol e Basi ...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Olá MK2...

Onde tens:

$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', '$time')";

Podes fazer:

$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', NOW())";

##########################

Onde tens:

$sql2="UPDATE $tbl_name SET time='$time' WHERE session = '$session'";

Podes fazer:

$sql2="UPDATE $tbl_name SET time=NOW() WHERE session = '$session'";

Assim, deixas de precisar da variável $time

############################################################

Onde tens:

$sql4="DELETE FROM $tbl_name WHERE time<$time_check";

Podes fazer algo como:

$sql4="DELETE FROM $tbl_name WHERE time<=DATE_SUB(NOW(),INTERVAL 1 MINUTE)";

Repara que assim a $time_check é desnecessária :thumbsup::(

###############################################################

No entanto... o session_start() cria um session_id novo quando a sessão expira.... qualquer sessão tem o seu session_id, ok?

Vamos então pensar na lógica do teu script... Imagina que a tabela nao tem sessoes registadas...

1 - Faz o session_start() (logo cria um session_id)....

2 - Não existe na bd, logo vai registá-lo com o time = ao tempo actual....

3 - Corre o DELETE, so que como a nossa session foi criada agora, nao a vai remover... nao tem mais de 60 segundos

4 - Fazes um refresh...

5 - Faz o session_start() (como a session anterior não foi terminada pelo php, retorna o mesmo session_id());

/** AQUI, imagina que a sessão tem mais de 60 segundos **/

6 - Como existe na bd, faz o update para actualizar a time = ao tempo actual...

7 - Corre o DELETE ... mas como acabámos de actualizar a time... ela já não vai ter mais de 60 segundos, mas inicialmente tinha.

e assim sucessivamente. :D Fui claro?

Share this post


Link to post
Share on other sites
MK2

Sim... Mas assim ele vai apagar depois de 1 minuto de inactividade??


Cumps;Mk2_______________________________________________Se não fosse o C estaríamos a usar Pasal, obol e Basi ...

Share this post


Link to post
Share on other sites
MK2

Agora não cria registos na Base de dados


Cumps;Mk2_______________________________________________Se não fosse o C estaríamos a usar Pasal, obol e Basi ...

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

MK2 ....

Aquilo que te disse para alterares, fará o necessário para apagar caso o time tenha mais de 1 minuto de diferença do tempo actual....

No entanto, e como é lógico não te vou dar a solução desta pergunta que te vou fazer, achas que a ordem que eu listei está correcta? (Justifique a sua resposta :()....

:thumbsup: Pensa nisso

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Agora não cria registos na Base de dados

-.- MK2 ... o campo time da base de dados é do tipo DATE/TIME ? .... (parece-me que não...)

Se for do tipo timestamp altera o insert para:

$sql1="INSERT INTO $tbl_name(session, time)VALUES('$session', " . time() . ")";

e o update:

$sql2="UPDATE $tbl_name SET time=" . time() . " WHERE session = '$session'";

Share this post


Link to post
Share on other sites
MK2

É int


Cumps;Mk2_______________________________________________Se não fosse o C estaríamos a usar Pasal, obol e Basi ...

Share this post


Link to post
Share on other sites
MK2

Já está Datetime.. Funciona.. Obrigado...


Cumps;Mk2_______________________________________________Se não fosse o C estaríamos a usar Pasal, obol e Basi ...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.