【问题标题】:Controlling the display of Column if the user is Admin or Not如果用户是管理员,则控制列的显示
【发布时间】:2018-12-25 04:23:42
【问题描述】:

我是 sql 新手,我正在为我的数据库使用 myphpadmin,如果用户登录名是 Admin 或不是,我正在尝试控制 Column 的显示。我显示的列来自两个不同的表,即 TableA 和 Tableb。我确实将列中具有共同值的两个表结合起来,如果登录的用户是管理员,则显示所有需要显示的列,但我不知道如果登录的用户如何控制显示

我有三个名为的表;

TableA:

 id      Name    Section    Grade    status

 1a      aika    Section1    A       Active
 2s                          B       Inactive

=============================================

TableB:

id     PR_id     Name      Section    

111    2s      laika       Section2   
222    2s      Bes         Section3 

用于显示所有列的查询

 SELECT * FROM TableA WHERE Name != ''
 UNION
 SELECT TableA.id, TableB.Name, TableB.Section, TableA.Grade, TableA.status 
 FROM TableA 
 INNER JOIN TableB ON TableA.id = TableB.PR_id

输出是;

 id   Name   Section     Grade    status    

 1a   aika   Section1    A        Active      
 2s   laika  Section2    B        Inactive
 2s   Bes    Section3    B        Inactive

表用户

  id    username     usertype
  1     aika         admin
  2     den          user
  3     lina         user

如果 aika 是因为她是管理员而登录的人

所有此列都将显示给管理员

 id   Name   Section     Grade    status    

 1a   aika   Section1    A        Active      
 2s   laika  Section2    B        Inactive
 2s   Bes    Section3    B        Inactive

但是如果 den/lina 是因为她是用户而登录的 仅为她显示的列在下方,她将看不到等级列

 id   Name   Section       status    

 1a   aika   Section1     Active      
 2s   laika  Section2     Inactive
 2s   Bes    Section3     Inactive

我正在尝试此查询,但它不起作用我非常感谢任何建议或建议/帮助非常感谢您

 Select usertype from Tableuser Where usertype='Admin'( SELECT * FROM TableA 
 WHERE Name != ''
 UNION
 SELECT TableA.id, TableB.Name, TableB.Section, TableA.Grade, TableA.status 
 FROM TableA 
 INNER JOIN TableB ON TableA.id = TableB.PR_id

【问题讨论】:

    标签: sql phpmyadmin


    【解决方案1】:

    回答你的问题有点困难,但我可以猜测一下。 您正在寻找的东西在 phpmyadmin 中没有实现。 PhpAdmin 显示所有表格以及表格包含的所有内容。

    要根据 phpAdmin 的要求显示各种结果,您必须至少学习一种用于查询这些表中数据的编程语言。许多人学习和使用 PHP,所以这将是您开始的好地方。

    祝你编程顺利。

    【讨论】:

      【解决方案2】:

      我认为您在错误的地方寻找解决问题的方法。事实上,您已经通过两种不同的方式(通过 phpMyAdmin 和通过 SQL 查询进行限制)询问了这个问题,我认为第三种方式是最好的解决方案。

      通过 phpMyAdmin

      您当然可以通过 phpMyAdmin 和 MySQL/MariaDB 列级权限来限制这一点。这需要您为每个用户提供自己的 MySQL/MariaDB 用户帐户,这与您的 Tableuser 无关。我不建议这样做,因为您通常希望在您的应用程序中处理用户身份验证,而不是作为 MySQL/MariaDB 用户,但您提出了要求,所以这是怎么做的:

      首先,像往常一样创建新的用户帐户。然后在结果页面上(或任何时候从“用户帐户”选项卡编辑该用户),单击“数据库”子选项卡:

      从列表中选择正确的数据库,然后单击“Go”。

      下一页显示了数据库级别的权限。听起来您不想允许,但您的需求可能会有所不同。

      再次查看顶部的“表格”标签。这会将您带到表级权限。

      为此用户选择适当的权限;例如除“等级”之外的所有列的 SELECT 权限:

      现在您已在数据库级别限制该用户帐户能够从该列进行 SELECT。

      需要注意的是,当该用户在 phpMyAdmin 中并尝试浏览该表时,他们将收到错误消息;这是因为 phpMyAdmin 试图在表上运行“SELECT *...”查询,当然权限会阻止这种情况。最简单的解决方法是添加一个bookmark,而不是像SELECT `id`, `name`, `section`, `status` FROM `TableA` 这样的查询。将此书签命名为与表相同的名称,当用户单击“浏览”链接时,将使用它而不是“SELECT *”查询。

      结果:

      通过您的应用程序

      如果您的应用程序查询数据库,您可以动态生成适当的查询: SELECT `usertype` FROM `Tableuser` WHERE `id` = $userid;

      然后使用简单的 if 测试;如果结果为“admin”,则生成查询为SELECT `id`, `name`, `section`, `grade`, `status` FROM `TableA`,否则将查询设置为SELECT `id`, `name`, `section`, `status` FROM `TableA`。由于您可能无论如何都在构建“id”部分,因此这是处理这些事情的好方法。您还可以通过相同的测试向管理员用户展示额外的功能,例如用户管理或部分管理。 (请注意,与您的 UNION/INNER JOIN 查询相比,我使用的是简化的 SELECT,但概念是相同的;我只是降低了复杂性以提高可读性)

      作为 SQL 查询

      我认为您需要使用存储过程或函数来严格使用 SQL 进行测试。没有'if/then/else' construct in native MySQL/MariaDB-flavor SQL,我看不到任何明显的方法可以根据管理测试的结果执行两个不同的查询。有足够动力的人可能能够拼凑出CASE or IF statement,但在几分钟的测试中,我无法得到任何接近你想要的东西(例如在'sakila'数据库中运行SELECT (SELECT IF(1>2,'`first_name`','`last_name`')) FROM `actor` WHERE 1`没有返回预期的结果)。我很高兴被证明是错误的,但这似乎是一个脆弱的测试,最好作为应用程序级逻辑处理。

      【讨论】:

        猜你喜欢
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-04-24
        • 2018-04-06
        • 2016-02-21
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多