IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Enregistrer une donnée en BDD à la fermeture de tous les navigateurs


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 1
    Points
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    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

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    ça serait donc ça... Je vais tester la chose et vous tient au courant. Merci pour l'info

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    c'est l'utilisateur qui lance script

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    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 ?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    - 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

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    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

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    au passage pourquoi PHP 4 ? t'es chez quel hébergeur ?

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    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 ?

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    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 ...

  12. #12
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    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.

Discussions similaires

  1. [C#] Récupération d'une donnée dans BDD Access
    Par Kerod dans le forum Windows Forms
    Réponses: 8
    Dernier message: 29/07/2014, 19h29
  2. Comment afficher une liste sur la même ligne avec tous les navigateurs
    Par Alexandrebox dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 25/07/2010, 03h05
  3. Réponses: 4
    Dernier message: 05/10/2009, 18h58
  4. Réponses: 4
    Dernier message: 10/09/2007, 12h05
  5. Réponses: 1
    Dernier message: 22/03/2006, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo