-
Verrouiller accès table
Bonjour,
Je voudrais savoir comment verrouiller les lignes des tables utilisées par un visiteur.
Lorsqu'un visiteur ouvre une session (avec session_start() et $_SESSION) je souhaite que toutes les lignes des tables qu'il va utiliser soient verrouillées.
Pratiquement, le visiteur n° 100 ouvre son espace, je veux que toutes les lignes avec un id 100 soient interdite en écriture pour d'autres visiteurs.
Il s'agit d'une appli destinée à un organisme de formation ==> des élèves travaillent sur un projet qui est supervisé par un professeur.
D'avance merci pour vos pistes
Cdlt
Je connais la méthode des transactions qui ne me va pas, puisse elle ne permet un verrouillage des lignes que pendant la transaction !
NB :
Pour commencer, comment éditer la liste des sessions ouvertes ?
-
Le plus viable est d'enregistrer la connexion de l'utilisateur dans la base de données (quitte à gérer entièrement les sessions en BDD d'ailleurs).
-
Merci pour ta réponse mais tu pourrais développer ?
"quitte à gérer entièrement les sessions en BDD d'ailleurs", je ne comprends pas, désolé
-
Salut,
il s'agit de mettre en place une couche au-dessus du système de session et de ton système d'authentification d'utilisateurs, tu as par exemple une table du type :
s_id | s_user_id | s_time
id de session | id de l'utilisateur | heure de la dernière mise à jour de session
avec d'autre champs supplémentaires pour sécuriser un peu plus les sessions, ex : l'ip, le user agent.
Lors de l'appel d'une page tu mets à jour la date de la session et tu supprimes les sessions obsolètes. Lors de la suppression des sessions obsolètes tu pourras ici débloquer tes lignes de tables SQL. Un autre problème est le lock/delock des lignes, je ne connais pas bien cela mais j'ai l'impression que cela dépend du moteur (MyIsam, InnoDB, etc.). Par exemple j'ai l'impression que MyIsam ne permet que le lock par table entière. Mais si tu utilises la méthode ci-dessus tu peux simplement tester si un enregistrement existe dans la table de sessions avec le user id auquel appartient les lignes avant l'écriture et interdire l'écriture si c'est le cas.
Tu peux aussi sans doute lire directement les fichiers de sessions sur le serveur si tu ne veux pas développer une surcouche au système de session existant mais il faut que tu aies accès au répertoire des fichiers de sessions. Tu stockes l'id en session, l'id sera donc dans le fichier de session lorsqu'un user se connecte. Lorsqu'un user veut écrire dans une table, tu parcours tous les fichiers de session sur le serveur et teste que l'id ne soit pas présent.
Sinon tu peux jeter un coup d'oeil du côté de :
http://www.php.net/manual/en/functio...ve-handler.php
Tu peux définir des callback pour les fonctions de base des sessions, en revanche je ne sais pas si tu peux détecter la destruction de session non manuelle, peut-être avec le callback gc().
-
-
Merci pour cette super réponse.
Je regarde ceci dans l'AM et te tiens informé de la suite
Cdlt
-
tu peux aussi créer des vues: une vue par utilisateur qui contient les attributs des différentes tables sélectionner par "where id = xxx;"
Ensuite, mettre les droits en écriture pour chaque utilisateur que sur sa vue.
update, insertion dans la ième vue se répercutera sur la (les) table(s).
-
Merci pour toutes ces réponses très intéressantes mais pratiquement maintenant comment je fais pour verrouiller et déverrouiller les lignes des tables concernées ?
Cdlt
-
Bin ça dépend, tu veux utiliser quelle soluce ?
(Ce que je veux dire c'est que si tu te bases sur les id stockés quelque part, y a pas de verrouillage de table, y a juste une condition pour exécuter les requêtes ou non)
-
avec les vues (une vue par utilisateur), tu mets les droits exactement comme sur une table classique:
Apparemment, dans ton cas, lecture, écriture, update pour l'utilisateur n° i et l'admin. Eventuellement, lecture pour les utilisateurs n° j avec j différent de i.
-
je pense utiliser la méthode "des vues" que je comprends bien.
Malgré le dévouement de plawyx je n'arrive pas à écrire le script qui me bloque par ex. les lignes avec id =100 des tables 1, 2, 3, 6, 8 lorsque le visiteur 100 ouvre sa cession ?
Je reste une burne sur ce coup là !
-
Simple : avant d'executer une requête, tu contrôles les utilisateurs ayant une session en cours.
-
Ah ouais ! Malin
Je regarde ceci de plus près pendant le WE.
Je dois néanmoins ré-organiser un peu mes tables.
Merci & bonne soirée
[MàJ] J'ai oublié de préciser que lorsque qu'un visiteur élève travaille sur son dossier son tuteur doit néanmoins pouvoir le lire ==> les lignes ne doivent être verrouillées qu'en écriture et en "delete".
J'ai beaucoup de mal à imaginer le script !