Sur mon site internet, il y a une page sur laquelle je renseigne toutes les mises à jour.
Cependant, il y a plusieurs sections et j'aimerais que les utilisateurs ne voit les mises à jours que s'ils ont accès à la section en question.
Pour cela, dans la table "utilisateur", il y a différentes "colonnes" : aut_sec1, aut_sec2, aut_sec3, etc. qui donnent l'autorisation ou non (booléen) aux sections du site.
et dans la table "majour" il y a différentes "colonnes" : aut_sec1, aut_sec2, aut_sec3, etc. qui disent à quelle section l'affichage de la mise à jour est destinée.
J'espère que j'arrive à me faire comprendre...
Ce que j'aimerai c'est que en fonction de la personne qui visite cette page, il puisse voir les messages destinés à tout le monde (avec aucune colonne de cochée) mais également ceux pour lesquels il a l'autorisation dans la table "utilisateur" et qu'elle soient triés par date.
Je vous remercie beaucoup pour le temps que vous allez me consacrer.
il y a différentes "colonnes" : aut_sec1, aut_sec2, aut_sec3, etc.
Je commencerais par revoir le modèle de données ...
Si tu veux avoir quelque chose de maintenable te d'évolutif, il faut normaliser. Le MCD serait :
Ce qui donne le schéma de base de données suivant :
Une fois cela est fait, pour stocker les sections que peut voir un utilisateur il faut un enregistrement par couple utilisateur/section dans la table utilisateur_section.
Pour stocker les sections que concerne une mise à jour il faut un enregistrement par couple majour/section dans la table utilisateur_section.
Une fois cela fait, pour lister les mises à jour en distinguant celles qui concernent l'utilisateur connecté (id connu) cela se complique, car imaginons qu'un utilisateur ait accès aux sections 1 et 2, et qu'une mise à jour concerne les sections 2 et 3, que devra voir l'utilisateur ?
Je suis novice dans les bases de données et de manière plus générale dans le codage.
Si je comprends bien il faudrait qu'il y ai 5 tables?
- utilisateur
- majour
- utilisateur_section
- majour_section
- section
Je viens d'apprendre ce qu'était le MCD (merci bien, voici une piste d'évolution)
Pour l'instant je n'arrive pas à comprendre ce MCD. Si jamais un utilisateur n'a pas accès à la section 3 mais que dans un an il y a le droit, verra-t-il toutes les mises à jours depuis le début?
Pour répondre à ta dernière question, normalement une mise à jour ne concernera qu'une seule section ou alors le site en général. Mais en effet, la question est à se poser.
Si jamais un utilisateur n'a pas accès à la section 3 mais que dans un an il y a le droit, verra-t-il toutes les mises à jours depuis le début?
Dans ce cas, il faut ajouter une notion de date sur les autorisations (donc dans la table utilisateur_section).
Avinetor a écrit:
une mise à jour ne concernera qu'une seule section
Dans ce cas les cardinalités entre mise à jour et section changent, et cela simplifie le problème évoqué plus haut ...
Le MCD devient :
Du coup, le schéma découle en 4 tables :
Pour lister les mises à jour qui concernent l'utilisateur connecté (dont tu connais l'id), la requête serait :
-- Liste des mises à jour visibles pour un utilisateur donné
SELECT M.*
FROM
mise_a_jour M
LEFT JOIN utilisateur_section US
ON M.id_section = US.id_section
AND US.id_utilisateur = 'id utilisateur connecté'
AND M.date_creation >= US.date_debut
WHERE
US.id_section IS NOT NULL
OR M.id_section IS NULL
ORDER BY M.date_creation
Cette requête va te sortir toutes les mises à jour liées à une section sur laquelle l'utilisateur connecté a l'autorisation et dont la date est supérieure à la date de début de cette autorisation ainsi que toutes les mise à jour "globales" (non liées à une section).
Avinetor a écrit:
je n'arrive pas à comprendre ce MCD
Je te conseille la lecture du document "Conception BDD" dans ma signature
Après quelques galères, ça fonctionne, merci beaucoup!
J'ai remplacé le "NULL"
OR M.id_section IS NULL
par "0".
Un grand merci !
Par contre je n'arrive pas à trouver la requête pour savoir si un utilisateur à accès à une section (avec la section en variable et l'utilisateur aussi vu que ça sera en fonction de sa connexion).
Je n'ai pas compris le coup du 0 au lieu du NULL... mais passons.
Pour savoir si un utilisateur a les droits sur une section, tu fais un SELECT sur la table utilisateur_section avec l'id de l'utilisateur et l'id section, si ça retourné quelque chose c'est qu'il a les droits sinon non ...
Je n'ai pas compris le coup du 0 au lieu du NULL... mais passons.
Ça ne marchait pas si je laissais le NULL mais en le remplaçant par 0 si (dans PhpMyAdmin non plus)
Concernant les accès est-il possible de faire une requête pour connaitre tous les accès d'un utilisateur (SELECT avec l'id de l'utilisation) et une fois cette requête extraite vérifier à l'aide d'une variable si il a accès à une section.
Par exemple, la requête SQL me sort un array pour l'utilisateur 1 avec les valeurs d'id_section : 2,4,5.
Et ensuite je recherche parmi ces valeurs si il a accès à la section en question : 1, il n'a pas accès, 2 il a accès, 3 il n'a pas accès
Avec ta proposition, je dois faire une requête SQL par recherche.
la requête SQL me sort un array pour l'utilisateur 1 avec les valeurs d'id_section : 2,4,5
-- Liste des sections autorisées pour un utilisateur donné
SELECT US.id_section
FROM utilisateur_section US
WHERE US.id_utilisateur = 1
ORDER BY US.id_section
La méthode PDO::fetch récupère seulement l'enregistrement suivant retourné par la requête ... Pour récupérer tous les enregistrements il faut mettre le fetch dans une boucle while ou utiliser PDO::fetchAll :
$req_aut = $bdd->prepare('
SELECT US.*
FROM utilisateur_section US
WHERE US.id_utilisateur = ?'
);
$req_aut->execute(array($_SESSION['id']));
$sections = $req_aut->fetchAll();
Il te faut vraiment reprendre les bases du fonctionnement PHP/MySQL ...
oui, je sais que j'ai encore pas mal de chose à apprendre.
J'ai suivi le cours que tu as mis en liens. Je suis parti de très très loin (aucune base de programmation j'ai fait le cours sur HTML et CSS juste avant le PHP/MySQL.)
Je viens de le relire et j'ai l'impression de le comprendre : j'arrive à sortir la liste des sections autorisées (avec while) pour un utilisateur donné mais je n'arrive pas à avoir une valeur booléenne pour dire que l'accès est autorisé ou non.
J'ai essayé avec in-array() mais le fetchAll() semble faire des "arrays" dans un "arrays" et du coup, il ne trouve pas la valeur.
J'avoue que je sèche un peu et c'est très certainement du à mes bases qui ne sont pas très solides. Je suis preneur de tout formation complémentaire au cours cité ci-dessus.
$req_aut = $bdd->prepare('
SELECT US.id_section
FROM utilisateur_section US
WHERE US.id_utilisateur = ?');
$req_aut->execute(array($idses));
while ($sections = $req_aut->fetch()){
echo $sections['id_section'];
{
Pour essayer de trouver si une valeur est présente j'essaye celui-ci mais il ne fonctionne pas :
$req_aut = $bdd->prepare('
SELECT US.id_section
FROM utilisateur_section US
WHERE US.id_utilisateur = ?');
$req_aut->execute(array($idses));
$sections = $req_aut->fetch();
if (in_array(2, $sections)) {
}
J'avais pensé à le faire comme cela mais dans une même page, la requête de section peut changer du coup, il faudrait que je fasse plusieurs requêtes différentes.
Alors que si je sors la liste et je recherche dedans si la valeur y est, je n'ai besoin que d'une seule requête.
// On récupère toutes les sections autorisées
$req_aut = $bdd->prepare('
SELECT US.id_section
FROM utilisateur_section US
WHERE
US.id_utilisateur = ?;');
$req_aut->execute( array( $_SESSION['id'] ) );
$sections = $req_aut->fetchAll();
Là ta variable $sections est un tableau de tableaux. Si l'utilisateur est autorisé à voir les sections 1, 3 et 7, $sections sera de la forme :
Je suis sûr que ta valeur "2" dans le code est une variable, donc elle provient d'ailleurs, et peut-être même d'une première requête exécutée plus tôt pour avoir la liste de toutes les sections ...
Si c'est le cas, tu peux t'affranchir de tous le code vu plus haut ... au moment où tu vas chercher la liste des sections, tu fais ceci :
SELECT
S.*,
COALESCE( US.id_section, 0 ) AS autorise
FROM
section S
LEFT JOIN utilisateur_section US
ON S.id_section = US.id_section
AND US.id_utilisateur = ?
Avec cette requête tu récupères TOUTES les sections, et avec une colonne "autorise" valant 0 si l'utilisateur connecté n'y a pas accès ...
Je pense que cela peut vraiment simplifier ton code ...
Je ne connaissait pas la fonction COALESCE() quelle est la différence avec IsNull()?
dans la table utilisateur_section, il n'y a aucune valeur nulle. Est-ce que ça sert quand même à quelque chose?
Le deux n'est pas vraiment une variable, en faite je l'utilise pour afficher un lien vers une section dans la barre de navigation si l'utilisateur y a accès.
Je vais également en avoir besoins dans chaque section afin de vérifier que l'utilisateur y a bien accès
Après ce bout de code, je peux utiliser le "autorise" comme variable ($autorise)?
Je ne connaissait pas la fonction COALESCE() quelle est la différence avec IsNull()?
COALESCE renvoi la première valeur non NULL dans l'ordre des paramètres ... donc si id_section est NULL alors on aura 0, sinon on aura l'id_section ...
ISNULL() contrôle si le paramètre est NULL et retourne un booléen (en fait 1 ou 0). Dans ce cas là, j'aurais en effet pu l'utiliser, mais avec un NOT
SELECT
S.*,
NOT ISNULL( US.id_section ) AS autorise
FROM
section S
LEFT JOIN utilisateur_section US
ON S.id_section = US.id_section
AND US.id_utilisateur = ?
Merci encore pour le temps passé et les différents points éclaircis.
Affichage en fonction des autorisations
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.