Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage en fonction des autorisations

Sujet résolu
    10 janvier 2019 à 18:20:52

    Bonjour,

    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.

    Avinetor

    • Partager sur Facebook
    • Partager sur Twitter
      10 janvier 2019 à 20:10:32

      Bonjour,

      Le principe du forum c'est : tu nous donnes le code que tu as déjà fait et on essaye de t'aider si tu as une difficulté sur un point précis.

      • Partager sur Facebook
      • Partager sur Twitter
        10 janvier 2019 à 20:32:05

        Bonjour,

        Avinetor a écrit:

        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 ?

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          10 janvier 2019 à 20:52:58

          Bonjour Benzouye et merci pour ta réponse.

          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.

          Merci encore pour ta réponse.

          • Partager sur Facebook
          • Partager sur Twitter
            11 janvier 2019 à 9:40:38

            Avinetor a écrit:

            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 ;)

            -
            Edité par Benzouye 11 janvier 2019 à 9:53:10

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              11 janvier 2019 à 10:35:16

              Merci beaucoup,

              Je vais regarder tout ça et reviendrais pour dire si tout fonctionne :-)

              • Partager sur Facebook
              • Partager sur Twitter
                13 janvier 2019 à 15:30:52

                Bonjour,

                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).

                Merci encore :)

                • Partager sur Facebook
                • Partager sur Twitter
                  13 janvier 2019 à 17:54:17

                  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 ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    14 janvier 2019 à 14:30:41

                    Benzouye a écrit:

                    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.

                    Merci bien.

                    Avinetor

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 janvier 2019 à 15:37:21

                      Avinetor a écrit:

                      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

                      Pas plus compliqué ...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        14 janvier 2019 à 15:42:39

                        Jusque là, j'avais bon.

                        Du coup c'est surtout pour recherchez le résultat en PHP que je bloque :-(

                        Tu peux m'aiguiller, s'il te plait?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 janvier 2019 à 16:00:08

                          Qu'as-tu écris en PHP ? Tu utilises PDO ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            14 janvier 2019 à 16:09:36

                            Oui, j'utilise PDO.

                            Voici le code PHP que j'ai mis

                            $idses = $_SESSION['id'];
                            
                            $req_aut = $bdd->prepare('SELECT US.*
                            FROM
                                utilisateur_section US
                                       WHERE US.id_utilisateur = ?');
                            $req_aut->execute(array($idses));
                            $autorisation = $req_aut->fetch();



                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 janvier 2019 à 16:27:37

                              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 ...

                              https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql

                              -
                              Edité par Benzouye 14 janvier 2019 à 16:28:09

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                14 janvier 2019 à 18:08:46

                                {#emotions_dlg.pleure} 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.

                                Encore une fois, un grand merci pour ton aide.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 janvier 2019 à 23:47:14

                                  Postes ton code ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                    15 janvier 2019 à 12:52:45

                                    Bonjour Benzouye,

                                    Voici le code utilisé pour afficher la liste :

                                    $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)) { 
                                    
                                    }




                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 janvier 2019 à 13:08:02

                                      Dans le deuxième code, pourquoi le 2 est-il écrit en dur ? Je suppose que dans ton vrai code, le 2 est une variable ...

                                      Dans tous les cas, pourquoi ne pas faire :

                                      $req_aut = $bdd->prepare('
                                      	SELECT US.id_section
                                      	FROM utilisateur_section US
                                      	WHERE
                                      		US.id_utilisateur = ?
                                      		AND US.id_section = ?');
                                      $req_aut->execute( array( $idses, 2 ) );
                                      $sections = $req_aut->fetchAll();
                                      
                                      if( count($sections) > 0 ) {
                                      	echo 'Section autorisée';
                                      } else {
                                      	echo 'Section non autorisée';
                                      }

                                      -
                                      Edité par Benzouye 15 janvier 2019 à 13:08:25

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                        15 janvier 2019 à 13:51:07

                                        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.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          15 janvier 2019 à 14:51:28

                                          Donc on retombe sur le fetchAll ...

                                          // 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 :

                                          array(
                                          	array( 'id_section' => 1 ),
                                          	array( 'id_section' => 3 ),
                                          	array( 'id_section' => 7 ),
                                          )

                                          Tu peux donc "bricoler" ta variable pour faciliter la recherche :

                                          $autorisees = array();
                                          foreach( $sections as $section ) {
                                          	$autorisees[] = $section['id_section'];
                                          }

                                          Le tableau $autorisees sera alors de la forme :

                                          array( 1, 3, 7 )

                                          Tu pourras ensuite l'utiliser pour recherche avec in_array :

                                          if( in_array( 2, $autorisees ) ) {
                                             ...
                                          }
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                            15 janvier 2019 à 15:30:51

                                            Génial!

                                            C'était le "bricolage" que je cherchais...

                                            Merci beaucoup pour ton aide, tout fonctionne.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              15 janvier 2019 à 15:43:01

                                              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 ...

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                15 janvier 2019 à 17:55:55

                                                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)?

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  15 janvier 2019 à 18:19:08

                                                  Avinetor a écrit:

                                                  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 :p

                                                  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 = ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                    16 janvier 2019 à 16:49:39

                                                    Merci encore pour le temps passé et les différents points éclaircis.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    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.
                                                    • Editeur
                                                    • Markdown