Deconnexion automatique d'un membre au bout de x minutes

Eléphanteau du PHP | 45 Messages

30 mai 2013, 22:46

Bonjour,

J'essaie de créer un espace membre ou le membre serait déconnecter de sa session au bout de x minutes

Pour cela j'ai ce code là :
<?php
function nb_et_pers_connecte()
{
if(isset($_SESSION['membre_pseudo']))
{
        $dnns = mysql_fetch_array(mysql_query('select count(membre_pseudo) as nb from connectes where membre_pseudo="'.$_SESSION['membre_pseudo'].'"'));
        if($dnns['nb']>0)
        {
                mysql_query('update connectes set timestamp="'.time().'" where membre_pseudo="'.$_SESSION['membre_pseudo'].'"');
        }
        else
        {
                mysql_query('insert into connectes(membre_pseudo, timestamp) values("'.$_SESSION['membre_pseudo'].'", "'.time().'")');
        }
}
$times_m_5mins = time()-(1*5);
mysql_query('delete from connectes where timestamp<"'.$times_m_5mins.'"');
$dnns2 = mysql_query('select membre_pseudo from connectes');
$num = mysql_num_rows($dnns2);
echo 'Il y a actuellement <strong>'.$num.'</strong> membre(s) connect&eacute;(s)';
if($num>0)
{
        echo ':<br />';
        $i=0;
        while($dn2 = mysql_fetch_array($dnns2))
        {
                $i++;
                echo $dn2['membre_pseudo'];
                if($i<$num)
                {
                        echo ',';
                }
        }
}
echo '.';
}
?>
J'ai deux tables créer : une "membres du site" et l'autre "membre connectés"

table "membres" :
CREATE TABLE `membres` (
`membre_id` int(11) NOT NULL auto_increment,
`membre_pseudo` varchar(32) NOT NULL,
`membre_mdp` varchar(40) NOT NULL,
`membre_mail` varchar(100) NOT NULL,
`membre_inscription` bigint(20) NOT NULL,
`membre_naissance` varchar(11) NOT NULL,
`membre_msn` varchar(255) NOT NULL,
`membre_yahoo` varchar(255) NOT NULL,
`membre_aim` varchar(255) NOT NULL,
`membre_localisation` varchar(255) NOT NULL,
`membre_profession` varchar(255) NOT NULL,
`membre_avatar` varchar(255) NOT NULL,
`membre_biographie` text NOT NULL,
`membre_signature` text NOT NULL,
`membre_derniere_visite` bigint(20) NOT NULL,
`membre_banni` int(11) NOT NULL default '0',
PRIMARY KEY `membre_id` (`membre_id`),
UNIQUE (`membre_pseudo`),
UNIQUE (`membre_mail`)
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
AUTO_INCREMENT=1
table "connectes" :
CREATE TABLE `connectes` (
  `connectes_id` varchar(255) collate latin1_german2_ci NOT NULL,   
  `membre_pseudo` varchar(255) collate latin1_german2_ci NOT NULL,
  `timestamp` varchar(255) collate latin1_german2_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
Lorsque je rentre le pseudo avec son mot de passe, je vois apparaitre le pseudo du membre en question dans la table "connectes", lorsque je clique sur deconnexion, le membre s'enlève de la table connectes

Mais si je reste inactif, il reste connecté peut importe la valeur que j'apporte à
$times_m_5mins = time()-(1*5);
Merci de m'éclairer

Mammouth du PHP | 1967 Messages

31 mai 2013, 08:37

Je pense que tu update la date de validité avant de supprimer les insertions périmés. Si tu mets le DELETE avant le UPDATE ca devrait marcher.

Sinon vérifie bien la comparaison de tes dates
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 45 Messages

31 mai 2013, 13:05

Salut spols merci pour ta réponse, le membre est enlevé de la table "connectes" au bout de 5 secondes et si je réactualise la page il se remet de nouveau dans la table "connectes"...

Maintenant j'aimerai que lorsqu'il s'enlève de la table.. il soit obliger de se reconnecter avec son pseudo et son mot de passe

Peux-tu m'éclairer de nouveau

voici mon nouveau script
<?php
function nb_et_pers_connecte()
{
if(isset($_SESSION['membre_pseudo']))
{
		
        $dnns = mysql_fetch_array(mysql_query('select count(membre_pseudo) as nb from connectes where membre_pseudo="'.$_SESSION['membre_pseudo'].'"'));
		$times_m_5mins = time()-(1*5);
		mysql_query('delete from connectes where timestamp<"'.$times_m_5mins.'"');
        if($dnns['nb']>0)
        {
				
                mysql_query('update connectes set timestamp="'.time().'" where membre_pseudo="'.$_SESSION['membre_pseudo'].'"');
				
		}
        else
        {
                mysql_query('insert into connectes(membre_pseudo, timestamp) values("'.$_SESSION['membre_pseudo'].'", "'.time().'")');
        }
}
$dnns2 = mysql_query('select membre_pseudo from connectes');
$num = mysql_num_rows($dnns2);
echo 'Il y a actuellement <strong>'.$num.'</strong> membre(s) connect&eacute;(s)';
if($num>0)
{
        echo ':<br />';
        $i=0;
        while($dn2 = mysql_fetch_array($dnns2))
        {
                $i++;
                echo $dn2['membre_pseudo'];
                if($i<$num)
                {
                        echo ',';
                }
        }
}
echo '.';
}
?>

Eléphant du PHP | 56 Messages

31 mai 2013, 13:28

Bonjour,

Tu peux peut être faire une session timestamp, et tester la session. Si la différence est supérieur à X minutes tu destroy la session membre.

Eléphanteau du PHP | 45 Messages

03 juin 2013, 01:46

Alors j'ai fais ceci
<?php
function nb_et_pers_connecte()
{
if(isset($_SESSION['membre_pseudo']))
{
		
        $dnns = mysql_fetch_array(mysql_query('select count(membre_pseudo) as nb from connectes where membre_pseudo="'.$_SESSION['membre_pseudo'].'"'));
		
        if($dnns['nb']>0)
        {
				$times_m_5mins = time()-(1*5);
				if(isset($times_m_5mins))
				{
				mysql_query('delete from connectes where timestamp<"'.$times_m_5mins.'"') AND session_destroy();
				}
				else
				{
                mysql_query('update connectes set timestamp="'.time().'" where membre_pseudo="'.$_SESSION['membre_pseudo'].'"');
				}
				
		}
        else
        {
		
                mysql_query('insert into connectes(membre_pseudo, timestamp) values("'.$_SESSION['membre_pseudo'].'", "'.time().'")');
        }

}
$times_m_5mins = time()-(1*5);
mysql_query('delete from connectes where timestamp<"'.$times_m_5mins.'"');
$dnns2 = mysql_query('select membre_pseudo from connectes');
$num = mysql_num_rows($dnns2);
echo 'Il y a actuellement <strong>'.$num.'</strong> membre(s) connect&eacute;(s)';
if($num>0)
{
        echo ':<br />';
        $i=0;
        while($dn2 = mysql_fetch_array($dnns2))
        {
                $i++;
                echo $dn2['membre_pseudo'];
                if($i<$num)
                {
                        echo ',';
                }
        }
}
echo '.';
}
?>
Le problème c'est que la session se déconnecte directement et ne prend pas en compte les 5 secondes...

Merci de m'éclairer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 juin 2013, 08:07

Salut,


Le isset sur $time_m_5mins ne sert a rien tu déclare la variable a la ligne du dessus.

Par contre tu doit vérifier s'il est négatif ou égale a zéro. Car dans ce cas la session a expirée.

Il y a plusieurs autres sujet similaire très récents si tu veux d'autres infos.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 45 Messages

11 juin 2013, 01:29

Alors j'ai fais ceci mais rien n'y fait...
<?php
function nb_et_pers_connecte()
{
if(isset($_SESSION['membre_pseudo']))
{
		
        $dnns = mysql_fetch_array(mysql_query('select count(membre_pseudo) as nb from connectes where membre_pseudo="'.$_SESSION['membre_pseudo'].'"'));
		
        if($dnns['nb']>0)
        {
				$times_m_5mins = time()+(1*5);
				$_SESSION['membre_pseudo']=time();
				if($times_m_5mins >= 0)
				{
				mysql_query('delete from connectes where timestamp<"'.$times_m_5mins.'"') AND session_destroy();
				}
				else
				{
				$_SESSION['membre_pseudo']=time();
                mysql_query('update connectes set timestamp="'.time().'" where membre_pseudo="'.$_SESSION['membre_pseudo'].'"');
				}
				
		}
        else
        {
		
                mysql_query('insert into connectes(membre_pseudo, timestamp) values("'.$_SESSION['membre_pseudo'].'", "'.time().'")');
        }

}
$dnns2 = mysql_query('select membre_pseudo from connectes');
$num = mysql_num_rows($dnns2);
echo 'Il y a actuellement <strong>'.$num.'</strong> membre(s) connect&eacute;(s)';
if($num>0)
{
        echo ':<br />';
        $i=0;
        while($dn2 = mysql_fetch_array($dnns2))
        {
                $i++;
                echo $dn2['membre_pseudo'];
                if($i<$num)
                {
                        echo ',';
                }
        }
}
echo '.';
}
?>
"$times_m_5mins" n'est pas pris en charge par php et le membre est déconnecter directement après s'être connecté..

Merci de m'éclairer

Mammouth du PHP | 1967 Messages

11 juin 2013, 08:43

Voir commentaire dans le code
Alors j'ai fais ceci mais rien n'y fait...
<?php
function nb_et_pers_connecte()
{
if(isset($_SESSION['membre_pseudo']))
{
		
        $dnns = mysql_fetch_array(mysql_query('select count(membre_pseudo) as nb from connectes where membre_pseudo="'.$_SESSION['membre_pseudo'].'"'));
		
        if($dnns['nb']>0)
        {
				$times_m_5mins = time()+(1*5);//Time retourne un temps en secondes, lui ajouter 1*5 ne lui ajoute que 5 seconde
				$_SESSION['membre_pseudo']=time();
				if($times_m_5mins >= 0)//Toujours vrai, time() retourne un entier positif correspondant au nombre de seconde depuis une date(me rappel plus exactement laquelle)
				{//Donc logiquement cette requète s'éxécute à chaque fois
				mysql_query('delete from connectes where timestamp<"'.$times_m_5mins.'"') AND session_destroy();
				}
				else
				{//Jamais vrai, forcement
				$_SESSION['membre_pseudo']=time();
                mysql_query('update connectes set timestamp="'.time().'" where membre_pseudo="'.$_SESSION['membre_pseudo'].'"');
				}
				
		}
        else
        {
		
                mysql_query('insert into connectes(membre_pseudo, timestamp) values("'.$_SESSION['membre_pseudo'].'", "'.time().'")');
        }

}
$dnns2 = mysql_query('select membre_pseudo from connectes');
$num = mysql_num_rows($dnns2);
echo 'Il y a actuellement <strong>'.$num.'</strong> membre(s) connect&eacute;(s)';
if($num>0)
{
        echo ':<br />';
        $i=0;
        while($dn2 = mysql_fetch_array($dnns2))
        {
                $i++;
                echo $dn2['membre_pseudo'];
                if($i<$num)
                {
                        echo ',';
                }
        }
}
echo '.';
}
?>
Je pense qu'on l'a déjà dit, mais tu dois penser ton code autrement.
A chaque connection, tu ajoute à la session de l'utilisateur une date de péremption.
A chaque action de l'utilisateur tu vérifie sa date de péremption
si elle est encore valide tu lui redonne une nouvelle date de peremption
si elle ne l'est pas tu déconnecte l'utilisateur (suppression de session + DELETE dans ta base)
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 45 Messages

11 juin 2013, 16:51

J'ai fait ceci mais rien n'y fait...
<?php
function nb_et_pers_connecte()
{
if(isset($_SESSION['membre_pseudo']))
{
               
        $dnns = mysql_fetch_array(mysql_query('select count(membre_pseudo) as nb from connectes where membre_pseudo="'.$_SESSION['membre_pseudo'].'"'));
               
        if($dnns['nb']>0)
        {
                                $times_m_5mins = time()-(1*5);
                                $_SESSION['membre_pseudo']=time();
                                if($times_m_5mins <= 0)
                                {
								mysql_query('update connectes set timestamp="'.time().'" where membre_pseudo="'.$_SESSION['membre_pseudo'].'"');
                                }
                                if ($times_m_5mins > 0)
                                {
								mysql_query('delete from connectes where timestamp<"'.$times_m_5mins.'"') AND session_destroy();
								}
                               
                }
        else
        {
               
                mysql_query('insert into connectes(membre_pseudo, timestamp) values("'.$_SESSION['membre_pseudo'].'", "'.time().'")');
        }

}
$dnns2 = mysql_query('select membre_pseudo from connectes');
$num = mysql_num_rows($dnns2);
echo 'Il y a actuellement <strong>'.$num.'</strong> membre(s) connect&eacute;(s)';
if($num>0)
{
        echo ':<br />';
        $i=0;
        while($dn2 = mysql_fetch_array($dnns2))
        {
                $i++;
                echo $dn2['membre_pseudo'];
                if($i<$num)
                {
                        echo ',';
                }
        }
}
echo '.';
}
?>
Suis-je sur la bonne voie???????

Mammouth du PHP | 1967 Messages

11 juin 2013, 17:00

tu n'écoute pas ce qu'on te dit, lis biens les commentaires que j'ai mis dans mon post précédent et mes indications en dessous du code.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 45 Messages

11 juin 2013, 20:39

Mais le fait d'utiliser la variable
 $times_m_5mins 
ne suffit pas comme date ou temps de peremption plutôt???

Mammouth du PHP | 1967 Messages

12 juin 2013, 08:35

absolument pas, tu la crée à chaque fois et tu la teste juste après. Ta condition est toujours remplie.

2 choses importantes,
-time() retourne un nombre entier positif de seconde (relativement grands)
-Retirer (1 * 5) à des seconde revient à retirer 5 secondes (à un nombre relativement grands, il reste positif, donc >= 0)

Il y a 2 façon de faire,
soit tu donne après chaque action d'un membre sa date de péremption et tu la compare avant chaque action avec la date actuelle
soit tu donne après chaque action du membre sa date de dernière action et tu la compare avant chaque action avec la date actuelle moins la durée de validité d'une session

L'un ou l'autre est équivalent.

Dans tous les cas, tu dois partir d'un formulaire de connexion. Si les données sont valide, tu lui donne des variables de session et tu ajoute son pseudo en base.

Chaque page qui vérifie que l'utilisateur est connecté doit :
vérifier la présence de variable de session si pas => renvoi vers la page de connexion ou affichage de la page comme un invité
vérifier la validité de cette session
si non valide, suppression de la session, suppression de la ligne en base le concernant et renvoi vers la page connexion ou affichage comme invité
Si valide, on met à jour sa date en session, sa ligne en base et affichage comme membre

L'affichage des personnes connecté sera séparé, cela tu le fait bien.

[remarque pour quand cela fonctionnera telle que décrit plus haut]
Par la suite, tu remarqueras que si quelqu'un est inactif pendant plus de 5 minutes, et qu'un autre membre regarde tes pages, il verra encore le premier membre dans la liste des connectés. Il te faudra alors ajouter AUSSI en base la date de validité afin de pouvoir inclure une condition dans ta requète SELECT d'affichage des membres connectés. Pour cela, il y a moyen d'utiliser des champs de table spécifique aux temps et ainsi faciliter tes requêtes. Finalement, pour ne pas asphixier ta table, il faudra la nettoyer régulièrement. Si un membre reste connecté suffisament longtemps sans action de sa part, sa session sera détruite par le système sans que ta table ne soit mise à jour. Je te suggère donc de mettre une suppression automatique des sessions périmées avant chaque affichage. Un DELETE de chaque ligne dont la date est périmé peut s'envisager, même pas besoin de vérifier qu'il y en a
[fin de la remarque; Pour ne pas te compliquer la tâche, commence par le début de mon post et revient vers ceci quand cela fonctionnera]
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube