Session et statut [Résolu]

Signaler
Messages postés
139
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2010
-
Messages postés
139
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2010
-
Bonjour,
Je travaille avec les sessions pour mon site afin de montrer les utilisateurs en ligne.
Donc lors de la connexion, j'applique une UPDATE sur la base de donnée, l'utilisateur est donc en ligne.
Le problème est pour la déconnexion ... si  l'utilisateur ne se déconnecte pas manuellement, comment faire pour que la requête sql s'applique quand même ?

Merci

7 réponses

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Plusieurs solutions.
Ce que je ferai :
Lors de la connexion, et de toutes les pages vues, UPDATE de la DB avec timestamp du dernier signe de vie.
Ensuite purge des enregistrements dont le timestamp est inférieur à XX secondes, initiée par les requêtes des autres visiteurs.

Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

@kopierreko = > tu n'es pas obligé de répéter ce que je venais d'écrire

Ton script ne fonctionnera pas correctement, nottament avec la $tt_s qui ne représente rien.
=>
<?php
session_start();
include('conf.php');
mysql_connect($host, $id, $psw);
mysql_select_db($bdd);
$id_m = $_SESSION['id'];

if (isset($_SESSION['pseudo'])) {
 
  $id = $_SESSION['id'];
  $timestamp_n = mktime();
  $temps_deco = $timestamp_n - 120;

  mysql_query("UPDATE membres SET time_co='$timestamp_n' WHERE id='$id'");
  $rech = mysql_query("SELECT * FROM membres");
 
  while ($r = mysql_fetch_array($rech, 'MYSQL_ASSOC')) {
    $id_c = $r['id'];  
    $t = $r['time_co'];  
    $p = $r['pseudo'];
 
    if ($t < $temps_deco) {
      $etat = "hors ligne";
    } else {
      $etat="en ligne";
    }
  }
}

mysql_query("UPDATE membres SET co='0' WHERE id='$id_c'");
=> à quoi ça te sert de faire une requête pour marquer le membre en/hors ligne alors que tu disposes du timestamp ? Sauf à avoir 5000 membres sur ton site ça ne sert pas à grand chose.
$temps_deco '30';> ça fait un peu limite non ? J'aurai plutôt vu un 120 à la place. Bon, ok, ça dépend du type de site que tu as. Menfin franchement, si tu as ne serait ce que 20 lignes de texte, je serai déco avant d'avoir fini la lecture.

Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
... tu n'es pas obligé de purger d'ailleurs, mais tu affiches seulement les membres avec un timestamp < XX sec. Menfin tout ça est à adapter à ta structure.

Kohntark -
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
...je ne sais pas exactement comme ta BDD est structurée mais tu peux faire le tout avec un timestamp et ne prendre en compte que les entrées récentes, et par ex. considèrer que l'utilisateur n'est plus en ligne après une inactivitée de 15min...

Si tu pouvais détailler un peux je pourrais peut-être en dire plus.

Bonne journée

<hr size="2" width="100%" />Some Geek: Tous les programmeurs sont des brutes, [...] ils violent chaque ligne, chaque language [...] et n'on aucun goût pour la beauté de ./sh

Pysco68:
Messages postés
139
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2010

C'est pas une mauvaise idée c'est vrai ^^
Je vais essayer
Messages postés
139
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2010

Voilà donc le résultat:

<?php
session_start();
include('conf.php');
mysql_connect($host, $id, $psw);
mysql_select_db($bdd);
$id_m = $_SESSION['id'];
mysql_query("UPDATE membres SET co='1' WHERE id=' $id_m '");

if (isset($_SESSION['pseudo'])) {
$année = date(Y);
$mois = date(m);
$jour = date(j);
$heure= date(G);
$min =  date(i);
$s   =  date(s);       

$heures_s = $heure*3600;
$min_s = $min*60;
$tt_s = $s+$heures_s+ $min_s;

$timestamp_n = mktime($heure, $min, $s, $jour, $mois, $année);
         $temps_deco = '30';

$id = $_SESSION['id'];

mysql_query("UPDATE membres SET time_co=' $tt_s ' WHERE id ='$id'");
$rech = mysql_query("SELECT * FROM membres");

while ($r =mysql_fetch_assoc($rech)) {
    $id_c = $r['id'];   
$t = $r['time_co'];   
$p = $r['pseudo'];

if($tt_s-$t>=$temps_deco){
    $etat = "hors ligne";
    mysql_query("UPDATE membres SET co='0' WHERE id=' $id_c '");
} else {
$etat ="en ligne";
}
}
}
?>

J'ai finalement utilisé les secondes, c'est moins compliqué, je trouve.
Ce script marche très bien. Merci beaucoup de m'avoir aiguillé.Très sympa.
Bye
Messages postés
139
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2010

J'ai mis 5 minutes pour la déco( j'avais mis là la version de test ).Très franchement, je n'ai pas l'habitude d'utiliser les timestamp et c'est pour ça que je travaille en secondes ^^
Merci beaucoup pour cette aide
Bye