Gestion session

Eléphant du PHP | 183 Messages

12 oct. 2015, 21:17

Bon me revoila j'ai travaillé sur cette affaire, alors, deja j'ai fait une fonction appelé en ajax toutes les 5s, qui actualise le timestamp de l'user en cours dans un champ de la bdd, un bigINT sinon time stamp en sql ça fait un truc de merde, mais ça marche, et au paasage actualise aussi ma liste d'amis donc toutes les 5s (surtout leurs statut et non plus qu'une la page chargé !)
Donc ensuite je suis en train de faire une fonction qui va gerer cette fois "GESTION GLOBAL des users connecté/expérié/ou déconnecté en mode bourrin
Donc en gros c'est ça =>

Code : Tout sélectionner

function control_online_user() { try { $bdd = new PDO ('mysql:host=localhost;dbname=xxx;charset=utf8', 'root', ''); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $id = $_SESSION['id']; $time_out = time() - 5000; //Actualise le timestamp de l'utilisateur $res = $bdd->prepare("SELECT id FROM inscription WHERE online_time < :time_out "); $res->bindParam ('id', $id, PDO::PARAM_INT); $res->bindParam ('online_time', $time_out, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); if ($res->rowCount() ) { $total_user = $res->fetch(PDO::FETCH_ASSOC); foreach ($total_user as $user) { $id = $user['id']; $res = $bdd->prepare("UPDATE inscription SET statut_connexion=0 AND statut_chat=0 WHERE id =:id "); $res->bindParam ('id', $id, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); } } }
Mais j'ai une erreur il semble dès la premiere requete !
ERREUR =>
<br /> <b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in /home/*****/function.php:348 Stack trace: #0 /home/*****/function.php(348): PDOStatement->execute() #1 /home*****/gestion_connexion_users.php(8): control_online_user() #2 {main} thrown in <b>/home/*****/function.php</b> on line <b>348</b><br />

Ya un probleme surement entre le timestamp de php et mysql qui semble pas parlé de la meme chose ?!%*

Mammouth du PHP | 2703 Messages

12 oct. 2015, 22:54

une requete préparée avec un paramètre et 2 bindParam, d'où "number of bound variables does not match number of tokens"

Eléphant du PHP | 183 Messages

13 oct. 2015, 13:03

Salut or 1, j'ai essayé avec bindValue, et ça fait pareil, de plus j'ai d'autre fonction qui marche avec plusieurs binValue, mais j'avoue que j'ai encore du mal avec pdo, je suis souvent tenté de refaire un bon vieux mysql_query....et hop requete, enfin faut que j'apprenne pour l'avenir, donc pdo avec du mal :-)

Je viens de voir par contre une erreur, itme_out pour time_out, c'est mieux que online pour time_out :-D =>

Code : Tout sélectionner

$res->bindValue ('time_out', $time_out, PDO::PARAM_INT);
là c'est mieux deja, mais tjs la même erreur

ViPHP
xTG
ViPHP | 7331 Messages

13 oct. 2015, 13:17

$res = $bdd->prepare("SELECT id FROM inscription WHERE online_time < :time_out ");
$res->bindParam ('id', $id, PDO::PARAM_INT);
$res->bindParam ('online_time', $time_out, PDO::PARAM_INT);
En rouge les paramètres de ta requête.
En bleu les paramètres que tu injectes dans la requête.

Tu vois pas comme un souci ? ;)

Sinon tu peux faire plus optimisé que cela en construisant une liste des IDs afin de ne faire qu'une seule requête.
Exemple :
UPDATE maTable SET champs=0 WHERE id IN (1,2,3,5,19,50)

Eléphant du PHP | 183 Messages

13 oct. 2015, 13:21

SISI ça y est regarde ma réponse j'ai vu mon erreur et corrigé, mais toujoours la même erreur.
Sinon lister les id n'est pas gerable, car une fois en route il y aura peut etre des milliers d'id, et je vais pas modifier ma requete a chaque fois qu'il y a un nouvel inscrit :-)
Sinon ça y est j'ai compris la différence entre bindValue et param, mais bon toujours cette erreur...

EDIT : Déjà j'ai viré la ligne id, car je cherche tous les id, pas que celui de l'user en cours....bete erreur, mais corrigé donc =>

Bon maintenant j'ai plus d'erreur, mais et hé oui mais :-D, j'ai noté des users en connecté et un chat qui ont un timestamp à 0, donc en théorie, ils auraient dû passer au bout de 5s ( coupe de script) aux statut connexion et chat à 0, et il y a eu q'un seul user remis hors ligne ?

Code : Tout sélectionner

$time_out = time() - 5; //Cherche les id des user qui n'ont pas a jour leur timestamp, donc deconnecté ou navigateur fermé $res = $bdd->prepare("SELECT id FROM inscription WHERE online_time < :time_out "); $res->bindParam ('time_out', $time_out, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); if ($res->rowCount() ) { $total_user = $res->fetch(PDO::FETCH_ASSOC); foreach ($total_user as $id) { echo $id; $res = $bdd->prepare("UPDATE inscription SET statut_connexion=0 AND statut_chat=0 WHERE id =:id "); $res->bindParam ('id', $id, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); }
:evil:
Modifié en dernier par laplumaencre le 13 oct. 2015, 16:21, modifié 1 fois.

Eléphant du PHP | 183 Messages

13 oct. 2015, 14:49

A ok xTG, si bien compris je devrais plutôt faire ça =>

Code : Tout sélectionner

$time_out = time() - 11; //Cherche les id des user qui n'ont pas a jour leur timestamp, donc deconnecté ou navigateur fermé $res = $bdd->prepare("UPDATE inscription SET statut_connexion=0, statut_chat=0 WHERE online_time<=:time_out "); $res->bindParam ('time_out', $time_out, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res);
ET c'est bon pas d'erreur ET ça passe bien les user à 0, et si je modif dans la bdd le statut, quelques secondes après il repasse bien à 0 sauf l'user en cours de connexion ??
YAHOOOOOOOOOOOOOOOOOOOO !!
GRAND merci à vous, pour m'avoir mis sur la bonne voix !
=D> :lol: :P :P :D :shock: :shock: :priere: :priere: :mrgreen: :mrgreen:

Eléphant du PHP | 183 Messages

30 janv. 2016, 16:37

Salut Tout le monde,
je reviens sur mon post car après utilisateur du site en suivant cette idée de script des actif, qui nettoie les inactif :-) , ça marche plutôt bien sauf que quand on test le site sur un smartphone avec un réseau de mer...là ça fout tout le système en l'air. J'ai fait donc un script qui envois le time toutes les 5s, et un autre qui repasse les users qui ont un time>time+11secondes (un peu marge pour quand même) a statut_connexion=0, mais avec réseau 3g, ça coupe un utilisateur qui croit toujours être connecté se retrouve dans la bdd en mode off, et donc personne peu le contacter alors que lui, il attend comme un c... qu'on l'appel...
Gros problème là, et comme c'est la seule solution que j'avais trouvé (et qu'on m'avait conseillé ici), je vois toujours pas comment réellement savoir quand un utilisateur est déconnecté ou pas, ou a fermer son navigateur en mode bourrin sans cliquer sur déconnecté...