vérifier l'existence de "liens croisés".
Posté : 16 avr. 2010, 18:06
Encore un problème, me dira stealth35 :p
Voici la situation :
Un tableau HTML, crée à l'aide d'une boucle PHP sur des entités.
Chaque ligne du tableau représente une structure, extraite de la table ci-dessous :
Le poste indique si un utilisateur appartient à telle structure.
L'audit représente une visite dans une structure, à laquelle on lie des visiteurs (auditeurs).
Donc lorsque je génère mon tableau HTML de structures, je peux récupérer une liste des auditeurs liés à cette structure.
Mon problème est le suivant :
J'aimerai savoir si dans mon tableau HTML, il y a des "audits croisés". Si pour un auditeur (A1) faisant une visite dans une structure (S2), y a t-il des membres (donc des utilisateurs ayant au moins un poste) de S2 étant auditeur (A2) d'une structure à laquelle appartient A1 (donc qui possède un poste chez A1).
Un exemple concret sous forme de tableau :
Soit un utilisateur U1, qui possède un poste dans la structure S1.
Soit un utilisateur U2, qui possède un poste dans la structure S2.
Soit un utilisateur U3, qui possède un poste dans la structure S3.
On lie U2 et U3 à l'audit de la structure S1. U2 et U3 sont donc des auditeurs, appelés A2 et A3.
On lie U1 à l'audit de la structure S2. U1 est donc un auditeur, appelé A1.
J'aimerai mettre en évidence ce cas là, car il devrait être interdit par l'application :
- Soit A2 n'a pas le droit d'être auditeur de S1, car A1 est membre de S1 et audite déjà A2 (structure à laquelle appartient A2)
- Soit A1 n'a pas le droit d'être auditeur de S2, car A2 est membre de S2 et audite déjà A1 (structure à laquelle appartient A1)
Structures | Auditeurs
S1 | A2, A3
S 2 | A1
J'ai donc tenté une requête comme ça :
J'espère avoir été suffisamment clair dans la description de mon problème.
Voici la situation :
Un tableau HTML, crée à l'aide d'une boucle PHP sur des entités.
Chaque ligne du tableau représente une structure, extraite de la table ci-dessous :
CREATE TABLE IF NOT EXISTS `jes` (
`je_id` smallint(6) NOT NULL AUTO_INCREMENT,
`je_nom` varchar(100) DEFAULT NULL,
PRIMARY KEY (`je_id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=241 ;
Sur chacune de ces lignes, j'ai un champ texte qui va me permettre de lier des auditeurs à cette structure. Une fois qu'au moins 1 auditeur a été choisi pour une structure donnée, un audit est crée pour cette structure. Voici la table des audits :CREATE TABLE IF NOT EXISTS `audits` (
`audit_id` int(11) NOT NULL AUTO_INCREMENT,
`audit_je_id` int(11) NOT NULL,
`audit_session_id` int(11) NOT NULL,
PRIMARY KEY (`audit_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
Les auditeurs sont des utilisateurs classiques, dont voici la table :
CREATE TABLE IF NOT EXISTS `users` (
`user_id` mediumint(9) NOT NULL AUTO_INCREMENT,
`user_prenom` varchar(50) DEFAULT NULL,
`user_nom` varchar(50) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=794 ;
Chaque utilisateur est également lié à une ou plusieurs structures, par une table de postes qu'il occupe :
CREATE TABLE IF NOT EXISTS `cnje_postes` (
`poste_id` int(11) NOT NULL AUTO_INCREMENT,
`poste_user_id` int(11) NOT NULL,
`poste_je_id` int(11) NOT NULL,
`poste_statut` tinyint(1) NOT NULL,
PRIMARY KEY (`poste_id`),
KEY `poste_user_id` (`poste_user_id`),
KEY `poste_je_id` (`poste_je_id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=765 ;
Et pour faire le lien entre un audit et un auditeur, une table de liaison :
CREATE TABLE IF NOT EXISTS `liaisons_audits_auditeurs` (
`laa_id` int(11) NOT NULL AUTO_INCREMENT,
`laa_audit_id` int(11) NOT NULL,
`laa_auditeur_id` int(11) NOT NULL,
PRIMARY KEY (`laa_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
Attention : les liaisons entre utilisateurs/structures via le poste, et utilisateurs/structures via l'audit n'ont rien à voir.Le poste indique si un utilisateur appartient à telle structure.
L'audit représente une visite dans une structure, à laquelle on lie des visiteurs (auditeurs).
Donc lorsque je génère mon tableau HTML de structures, je peux récupérer une liste des auditeurs liés à cette structure.
Mon problème est le suivant :
J'aimerai savoir si dans mon tableau HTML, il y a des "audits croisés". Si pour un auditeur (A1) faisant une visite dans une structure (S2), y a t-il des membres (donc des utilisateurs ayant au moins un poste) de S2 étant auditeur (A2) d'une structure à laquelle appartient A1 (donc qui possède un poste chez A1).
Un exemple concret sous forme de tableau :
Soit un utilisateur U1, qui possède un poste dans la structure S1.
Soit un utilisateur U2, qui possède un poste dans la structure S2.
Soit un utilisateur U3, qui possède un poste dans la structure S3.
On lie U2 et U3 à l'audit de la structure S1. U2 et U3 sont donc des auditeurs, appelés A2 et A3.
On lie U1 à l'audit de la structure S2. U1 est donc un auditeur, appelé A1.
J'aimerai mettre en évidence ce cas là, car il devrait être interdit par l'application :
- Soit A2 n'a pas le droit d'être auditeur de S1, car A1 est membre de S1 et audite déjà A2 (structure à laquelle appartient A2)
- Soit A1 n'a pas le droit d'être auditeur de S2, car A2 est membre de S2 et audite déjà A1 (structure à laquelle appartient A1)
Structures | Auditeurs
S1 | A2, A3
S 2 | A1
J'ai donc tenté une requête comme ça :
$audits_croises = get_value_from_query(sprintf("SELECT COUNT(poste_user_id)
FROM ".$tables["junior_entreprises"].", ".$tables["postes"]." POSTES_AUDITEUR, ".$tables["postes"]." POSTES_TARGETS, ".$tables["liaisons_audits_auditeurs"]."
WHERE POSTES_TARGETS.poste_je_id = '%d' AND POSTES_AUDITEUR.poste_je_id = audit_je_id AND audit_id = laa_audit_id AND laa_auditeur_id = POSTES_TARGETS.poste_user_id", $auditeur["user_id"]));
if($audits_croises > 0) {
// attention, cas interdit
}
qui donne ça : Mais cela me renvoie 0, alors que je suis bien dans un cas interdit. Un peu d'aide sur cette requête ne serait donc pas de refus : )SELECT COUNT(POSTES_TARGETS.poste_user_id) FROM cnje_junior_entreprises, cnje_postes POSTES_AUDITEUR, cnje_postes POSTES_TARGETS, cnje_liaisons_audits_auditeurs, cnje_audits WHERE POSTES_TARGETS.poste_je_id = '146' AND POSTES_AUDITEUR.poste_je_id = audit_je_id AND audit_id = laa_audit_id AND laa_auditeur_id = POSTES_TARGETS.poste_user_id
J'espère avoir été suffisamment clair dans la description de mon problème.