Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/07/2011, 23h39   #1
Invité de passage
 
Inscription : juillet 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 6
Points : 0
Points : 0
Par défaut Enregistrer une donnée en BDD à la fermeture de tous les navigateurs

Bonjour,

Nouveau sur le forum, je viens chercher de l'aide à un problème. Soit personne ne l'a rencontré soit c'est tellement simple que je ne vois pas comment faire (et donc personne n'en parle car je n'ai rien trouvé sur le sujet).

Situation : L'utilisateur se connecte à mon site, son status online est enregistré en BDD. S'il se déconnecte manuellement, il passe en offline dans la BDD. Jusque là tout va bien.

Comment mettre le status en offline à la fermeture du navigateur. Certain propose la solution ajax avec onunload ou onbeforeunload comme "activateur" du script. Déjà, avec ce système, la fonction qui doit se lancer au onunload/onbeforeunload se lance au chargement de la page (logique hein...). Au rafraichissement je veux bien mais pas au premier chargement de la page.

Je pensais travailler ainsi avec ce système :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
window.onload=loadingPage('1');
window.onunload=loadingPage('0');	
 
function loadingPage(mode) {
	if (window.XMLHttpRequest) {
		var xmlhttp=new XMLHttpRequest();
	}
	else {
		var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
 
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState==4 && xmlhttp.status==200) {
			var updateBool=xmlhttp.responseText;
			// Done
			alert(mode+" : "+updateBool);
		}
	}
 
	xmlhttp.open("GET","loading_page.php?mode="+mode,true);
	xmlhttp.send();	
}
du coup l'utilisateur est forcément déconnecté vu que unload/onbeforunload se lance à chaque chargement de page.

En plus, je veux que ça fonction quand l'utilisateur ferme sa dernière fenêtre (en supposant qu'il a ouvert plein d'onglet et de fenêtre du site).

Mon problème ne doit pas être impossible car sur tous les forums il y a un indicateur de membres online. Quand on ferme toutes les fenêtre du forum sur lequel on est, on apparait alors comme hors ligne pour les autres membres.

Bref un casse tête car je ne vois pas du tout comment faire ce truc.
Omizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 23h55   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
les autres systèmes marchent avec un timer, en gros si le membre est inactif depuis 5 min il apparait déconnecté, y'a pas d'histoire de fermer le navigateur ou pas
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 01h50   #3
Invité de passage
 
Inscription : juillet 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 6
Points : 0
Points : 0
ça serait donc ça... Je vais tester la chose et vous tient au courant. Merci pour l'info
Omizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 11h24   #4
Invité de passage
 
Inscription : juillet 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 6
Points : 0
Points : 0
Alors j'ai regardé et une question se pose : Si je lance le script a chaque fois que l'utilisateur utilise le site (script installé dans le fichier de session par exemple). Je teste bien le temps d'activité entre sa nouvelle action et la dernière mais ça ne permet pas de tester son activité une fois qu'il a quitter le site... Donc comment on fait pour lancer le script quand la personne ne fait plus rien, a fermer le navigateur et tout et tout ?

mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
session_start();
 
if (isset($_SESSION["time_before_abscent"]) && isset($_SESSION["time_before_disconnect"]) && isset($_SESSION["time_last_action"])) {
	$time_before_abscent=$_SESSION["time_before_abscent"];
	$time_before_disconnect=$_SESSION["time_before_disconnect"];
	$time_last_action=$_SESSION["time_last_action"];
 
	if (time()-$time_last_action>=$time_before_abscent && time()-$time_last_action<$time_before_disconnect) {
		// Met le status en absent
		mysql_query("...");
	}
	else if (time()-$time_last_action>=$time_before_disconnect) {
		// Met le status en hors ligne
		mysql_query("...");
	}
	else {
		$_SESSION["time_last_action"]=time();
	}
}
A mon avis, pour que ça marche il faudrait que le code de vérification d'activité se lance automatiquement toute les x secondes/minutes (et pas en ajax car si l'utilisateur ferme le navigateur il n'y aura pas de code pour lancer la requette...) Casse tête, je vois vraiment pas comment faire.
Omizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 12h25   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
c'est l'utilisateur qui lance script
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 12h36   #6
Invité de passage
 
Inscription : juillet 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 6
Points : 0
Points : 0
Merci, mais comment il peut le lancer s'il a fermé toutes les fenêtres voir éteint son ordinateur...

C'est dans la procédure que je n'arrive pas à cerner comment faire

Je suis perdu entre la durée de vie de la session et l'enregistrement de la date à laquelle l'utilisateur a fait sa dernière action. Sur gmail par exemple, au bout d'un certain temps d'inactivité, on passe en mode absent puis si ça dure en déconnecté.

Il y a donc bien un moment donné où un script se lance pour passer l'utilisateur en absent ou en déconnecté sans que l'utilisateur ai fait quelque chose. La question est donc où et comment ?
Omizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 13h16   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
- l'utilisateur se connecte
- dans ta base, le champs de "dernière connexion" est mise a jour, plus le champs disant qu'il est "connecter"
- dans la partie ou on voit les utilisateurs connectés, tu regarde qui est en "connecter" + depuis 5min
- quand l'utilisateur se déconnecte ton champs "connecter" est a 0, donc il ne s'affichera pas pour les autres, si il n'a aucune activité depuis 5min il est considéré comme déconnecter
- a chaque fois que l'utilisateur ouvre une page, le champs "dernière connexion" est mis a jour
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 13h35   #8
Invité de passage
 
Inscription : juillet 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 6
Points : 0
Points : 0
Ok je vois. Il me manquais le passage en BDD (enfin, je ne voulais le faire que si l'utilisateur était inactif et non à chaque chargement de page d'où mon "idée" de script qui se lance tout seul au bout d'un moment).

J'ai compris le concept, je vais voir ça. Merci
Omizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 14h19   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
au passage pourquoi PHP 4 ? t'es chez quel hébergeur ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 19h22   #10
Invité de passage
 
Inscription : juillet 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 6
Points : 0
Points : 0
Comme ça, ça fonctionne très bien bien merci.

PHP4 car je n'ai pas besoin d'objet et surtout je n'ai pas le temps de me mettre au php5. Sur le fond ça ne change rien, non ?
Omizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 19h56   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par Omizu Voir le message
Comme ça, ça fonctionne très bien bien merci.

PHP4 car je n'ai pas besoin d'objet et surtout je n'ai pas le temps de me mettre au php5. Sur le fond ça ne change rien, non ?
si quand même, de plus le support de PHP 4 est abonné depuis longtemps, d’ailleurs celui de la 5.2 aussi, c'est plus que vivement recommandé de mettre de PHP dans une version recente, c'est un peut comme si tu restais sur ton Windows 98, OK ça marche mais bon ...
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 10h33   #12
ovh
Rédacteur
 
Avatar de ovh
 
Homme
Ingénieur développement logiciels
Inscription : mai 2002
Messages : 3 725
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2002
Messages : 3 725
Points : 6 310
Points : 6 310
Citation:
Envoyé par Omizu Voir le message
PHP4 car je n'ai pas besoin d'objet et surtout je n'ai pas le temps de me mettre au php5. Sur le fond ça ne change rien, non ?
Si...

Peut-être n'as-tu pas perçu l'intérêt de la programmation orientée objet, mais c'est une manière efficace de développer, cela t'apporte des bonnes pratiques pérennes (les concepts objet sont valables dans la plupart des langages) et c'est la manière recommandée de coder en PHP aujourd'hui (en tout cas c'est clairement incontournable pour des applis professionnelles).

L'époque où on mélangeait gaiment dans un seul script le code html de présentation avec le code php pour afficher et mettre à jour les données avec des mysql_query() dans tous les coins est révolu depuis des années...
Ne te méprends pas, ce n'est pas pour le plaisir d'être à la mode, mais ce modèle de développement a montré ses limites et surtout ses faiblesses : problèmes de maintenance (code spaghetti illisible) et de sécurité (souvent ce type de code est mal protégé contre les failles connues comme par exemple les injections SQL). C'est ce type de développement qui a contribué à la mauvaise image de PHP ("langage d'amateur", sites souvent bourrés de failles), qui traîne encore cette réputation aujourd'hui.
Actuellement le monde de PHP a atteint la maturité et donc on code en objets, et on sépare bien les couches présentation et modèle (voir pattern MVC), tout cela étant facilité par l'utilisation d'un framework (Zend Framework ou Symfony sont les 2 frameworks les plus répandus).

Cela représente un temps d'apprentissage, certes, mais ça vaut vraiment le coup de s'y mettre.
Je comprends que pour un gros site, la migration est difficile (inutile de se voiler la face : il faut tout réécrire); mais si c'est un site de quelques pages, ça vaut le coup de faire l'effort crois-moi

Au passage, au niveau base de données c'est un peu pareil : souvent PHP4 est associé à une DB mysql au format myisam, qui là aussi est un choix obsolète peu pertinent vu l'absence d'intégrité référentielle. Il faut lui préférer le format innodb.
__________________
Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.
Je n'ai rien à voir avec la société www.ovh.com !
ovh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h34.


 
 
 
 
Partenaires

Hébergement Web