php my admin如果用户为Admin或Not,则控制Column的显示

时间:2018-07-17 12:50:18

标签: sql phpmyadmin

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

我有三个表命名;

Item

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

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

Tableuser

 id   Name   Section     Grade    status    

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

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

所有此列将显示为管理员

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

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

 id   Name   Section     Grade    status    

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

我正在尝试查询,但无法正常工作,我非常感谢任何建议或帮助。

 id   Name   Section       status    

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

2 个答案:

答案 0 :(得分:0)

我认为您在错误的位置寻找解决方案。实际上,您已经以两种不同的方式(通过phpMyAdmin和SQL查询进行限制)对此进行了询问,我认为第三种方式是最好的解决方案。

通过phpMyAdmin

您肯定可以通过phpMyAdmin和MySQL / MariaDB列级权限来限制此权限。这要求您为每个用户提供自己的MySQL / MariaDB用户帐户,该帐户与您的Tableuser无关。我不建议这样做,因为您通常想在应用程序中而不是作为MySQL / MariaDB用户来处理用户身份验证,但是您问到了,所以要做的是:

首先,像平常一样创建新的用户帐户。然后,在出现的页面上(或任何时候您都可以从“用户帐户”标签中编辑该用户),单击“数据库”子标签:

Database sub-tab

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

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

再次在顶部查找“表格”标签。这将带您进入表级权限。

为此用户选择适当的权限;例如除“ grade”以外的所有列的SELECT特权:

Table-level permissions editor

现在,在数据库级别上,您已限制该用户帐户能够从该列中进行选择。

一个警告是,当该用户位于phpMyAdmin中并尝试浏览该表时,他们将得到一个错误。这是因为phpMyAdmin尝试在表上运行“ SELECT * ...”查询,而权限当然可以阻止这种情况。最简单的解决方法是添加一个bookmark,而该查询具有一个类似SELECT `id`, `name`, `section`, `status` FROM `TableA`的查询。将此书签命名为与表相同的名称,当用户单击“浏览”链接时,将使用该书签代替“ SELECT *”查询。

结果: SQL query showing restricted user account

通过您的应用程序

如果您的应用程序查询数据库,则可以动态生成适当的查询: 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` '数据库未返回预期结果)。我很高兴看到错误,但是这似乎是一个脆弱的测试,最好将其作为应用程序级逻辑来处理。

答案 1 :(得分:0)

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

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

祝你编程顺利。