Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 29/08/2011, 10h25   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 79
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 79
Points : 12
Points : 12
Par défaut Savoir et afficher si un utilisateur est sur une page

Bonjour,

je développe une petite admin permettant une gestion de fiche.
Afin d'éviter le problème de 2 utilisateurs voulant modifier la même fiche en même temps, j'aimerais savoir si il y a un moyen de bloquer une fiche lorsqu'un utilisateur est déjà présent sur celle-ci et pouvoir afficher sur la page listant les fiches, quel utilisateur est présent sur la fiche en question.

Merci d'avance
luffyfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 10h37   #2
Membre éclairé
 
Avatar de Nowwis
 
Homme
Développeur Web
Inscription : juin 2009
Messages : 363
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juin 2009
Messages : 363
Points : 365
Points : 365
Salut,

L'idée :
- Lors de l'affichage de la ficher (form de modification je suppose), tu pourrais passer une valeur dans la base de donnée à 1 (sur la fiche par exemple, ajoute un champ "modif"), par défaut à 0.
Lors de l'arrivé d'un membre dessus, ça passe à 1.
Tu vérifies lors de la liste des fiches celle qui sont a 1 et tu ne fais pas de lien dessus, ça les "griseras" en quelques sorte. Et si la page du form, tu vérifies également qu'elle ne soit pas à 1 du coup, personne ne verra le form si elle est en cours de modification.

Lors de la validation de la fiche (modification), tu remets le champ à 0.

Et voilà, ton système marchera.
Nowwis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 11h03   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 79
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 79
Points : 12
Points : 12
salut Simdu80,
oui j'y avais pensé a cette solution, mais si une personne est sur la fiche, et qu'il ferme maladroitement le navigateur, je ne passerais pas le champ à 0, il restera à un et j'aurais un bug dans mon admin je pense...
n'y a t-il pas un moyen de faire comme sur certains forums ou on affiche les personnes présentes sur certains sujets ou endroit dans le forum ?
luffyfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 11h26   #4
Membre éclairé
 
Avatar de Kaamo
 
Homme Cyril
Ingénieur développement logiciels
Inscription : avril 2007
Messages : 205
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2007
Messages : 205
Points : 367
Points : 367
fouille du coté de l'événement "onunload" de javascript qui s'exécute lorsque tu fermes ou changes la page
Kaamo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 12h39   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 012
Points : 5 012
Tu n'es pas forcément obligé de passer par JavaScript - qui par ailleurs n'est pas un gage de sécurité car il peut être désactivé par le client, rendant ton système de sécurité caduc.

Supposons que la fiche qu'un utilisateur est en train de manipuler soit un fichier. Tu peux tout à fait poser un verrou dessus (voir flock) le temps du traitement et retirer le verrou une fois que l'utilisateur à fini ses changements. Au chargement de la page de visualisation de la fiche, tu vérifie l'état de ce verrou et s'il est posé, tu peux par exemple afficher un message "un utilisateur à ouvert cette fiche, elle n'est disponible qu'en lecture seule pour le moment".

Tu peux faire de même avec des bases de données en verrouillant des tables (LOCK TABLE) ou en mettant un flag dans une colonne pour éviter que 2 utilisateurs n'éditent la même ligne.

Tu peux également contourner le problème en utilisant des techniques beaucoup plus complexe basées sur du cache et le design pattern IdentityMap (en somme pour faire comme Hibernate en Java). Mais c'est chasser la mouche au bazooka si tu en arrive là...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 13h12   #6
Membre éclairé
 
Homme
F5(){F5}
Inscription : avril 2008
Messages : 256
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : F5(){F5}
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2008
Messages : 256
Points : 320
Points : 320
salut,

en complément de ce qui a été dit concernant la déconnexion maladroite de l'utilisateur.

Il faut distinguer la fin de consultation volontaire de la fiche, et le temps maximum de consultation accordé.

Si la fin de consultation est volontaire, tout baigne.
Sinon on peut procéder de deux manières :
la basique : tu mets une tempo max de consultation (ex : 15min). Au bout de 15 min, tu déconnectes l'utilisateur, et lui demande de se reco (mais pe que qq1 d'autre aura prit le jeton sur la fiche). Inconvénient : si l'utilisateur a désactivé js (...) et a quitté la page, alors on perd 15-x minutes pour rien.

la un peu mieux : tu mets une deuxieme tempo de présence (ex:1min). Toutes les minutes, tu dis au serveur que tu es toujours là. Si tu as le js activé, c'est transparent. Sinon, tu te fais spammer toutes les minutes.
Par contre, ca surcharge le serveur d'un appel toutes les minutes.

Après qui désactive encore son js!!

Enfin, je me pose la question de la déconnexion, ne peut-on pas imaginer un iframe avec un auto-refresh qui se charge de dire au serveur qu'on est toujours là?
Ca règle les problèmes de js!
galerien69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 14h49   #7
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 79
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 79
Points : 12
Points : 12
Merci pour vos réponses.
le but n'étant pas de partir dans des codes chassant la mouche au bazooka ^^
L'option "onunload" me parait pas mal, à condition que l'utilisateur ne ferme pas le navigateur, sinon la fonction ne fonctionne plus.
en fait, je cherche à connaitre si il est possible de savoir si l'utilisateur à fermé son navigateur pour exécuter un code qui repassera le flag à 0 pour que la fiche redevienne accessible.
Je ne voudrais pas surcharger le serveur avec plusieurs tempo.

Comment indiquer notre présence au serveur ? si je suis connecté, je teste ma session pour le savoir, mais si je ferme mon navigateur, je perd l’exécution du script vérifiant ma présence, non ?
luffyfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 15h55   #8
Membre éclairé
 
Avatar de Kaamo
 
Homme Cyril
Ingénieur développement logiciels
Inscription : avril 2007
Messages : 205
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2007
Messages : 205
Points : 367
Points : 367
Citation:
Je ne voudrais pas surcharger le serveur avec plusieurs tempo.
Malheureusement ... Attention, bidouillages moches en approche

Si tu veux utiliser une tapette plutôt qu'un bazooka pour cette mouche une solution devrait te plaire (n'utilisant pas javascript donc impossible à désactiver par l'utilisateur qui désactive le javascript.)

Cela consisterait à insérer, dans la page qui génère la fiche, un cadre (frame) de taille nulle, sans bordure (invisible en somme) qui se rechargerait toutes les X secondes, par exemple 60. Ainsi le serveur serait contacté toutes les minutes indiquant que l'utilisateur modifie la fiche. Ceci est bien sûr transparent pour l'utilisateur qui ne voit pas cette "frame" se charger.
Ainsi, à chaque chargement de la frame, tu indiques en base de donnée :
- le datetime du dernier refresh de l'utilsateur qui modifie la fiche

Imaginons qu'un nouveau veuille modifier la fiche :
- La fiche n'est pas lockée, donc la modification peut se faire.
- La fiche est lockée mais le dernier temps d'accès est plus grand que 1 minute, alors l'autre a du fermer la fenetre, le nouveau peut modifier
- La fiche est lockée et le dernier temps d'accès est plus petit que une minute, alors l'autre est encore entrain de modifier.

Bien sur, une minute est assez fréquent. Peut etre que cinq minutes n'est pas mal !

Niveau code dans la fiche :
Code :
<frame src="cadre_invisible.php" name="cadre_vide" noresize>
Contenu de cadre_invisible :
Code :
1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
  <meta http-equiv="Refresh" content="60; URL=cadre_invisible.php">
  <title>invisible</title>
</head>
<body>
<?php
// mettre à jour la base en indiquant l'heure de l'actualisation pour l'utilisateur connecté souhaitant apporter ses modifs à la fiche sélectionnée
?>
</body>
</html>
Kaamo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 16h51   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 012
Points : 5 012
Citation:
Envoyé par galerien69 Voir le message
Après qui désactive encore son js!!
Environ 11% des visiteurs la dernière fois que j'ai regardé.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 17h04   #10
Membre éclairé
 
Avatar de Kaamo
 
Homme Cyril
Ingénieur développement logiciels
Inscription : avril 2007
Messages : 205
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2007
Messages : 205
Points : 367
Points : 367
mais je voudrais ajouter que ma méthode bancale n'est pas à utiliser "à vie". Juste comme une rustine facile à mettre en place avant d'utiliser une meilleur méthode (bazooka) énoncée ci-dessus.
En effet, les frame sont amenées à disparaitre, donc il n'est pas recommandé de les utiliser
Kaamo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 17h36   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 79
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 79
Points : 12
Points : 12
merci pour votre aide, je vais essayer de mettre ca en place.
Je ne peux pas m'attaquer à un code bazooka dans le sens ou je n'ai pas beaucoup de temps pour dev mon appli, je passerais pas la case tapette qui par la suite sera remplacer par le bazooka
luffyfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 09h48   #12
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 79
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 79
Points : 12
Points : 12
Bon en fait, j'ai fait comme cela :
Sur un onload / onunload (en passant par l'ajax pour appeler mon code php de lock / unlock), je rempli 3 champs, id de l'employé, datetime sur l'ouverture de la fiche, et lock qui passe à 1 ou 0,

Vérif sur la page listant les fiches
SI lock est à 1
ALORS je vérifie si le datetime de l'ouverture +20min est supérieur à l'heure actuelle, si oui, fiche toujours locké, et j'affiche sur ma page d'accueil faisant un listing rafraichi toute les X minutes une icône de cadenas avec en info bulle le nom de l’employé et la date d'ouverture de la fiche.

SINON je déverrouille la fiche

et sur la fiche détail, la même vérif qui permettra de bloqué certaines fonctionnalités.

Cela semble bien fonctionnait
Merci beaucoup à tous pour vos idées
luffyfr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h36.


 
 
 
 
Partenaires

Hébergement Web