【问题标题】:How to exclude some data for some users?如何为某些用户排除某些数据?
【发布时间】:2021-05-02 18:19:30
【问题描述】:

我在 admin 列的 users 表中有一个值为 2 的主管理员。还有值为1的普通管理员和值为0的用户。

主管理员可以指定其他用户为管理员并获得管理员权限。我有一个用户列表页面,我设法进行了 SQL 查询,因此没有一个常规管理员显示主管理员。我还想确保不为其他常规管理员显示常规管理员,但为主管理员显示。怎么做? SQL有异常吗?我读了一些关于 EXCLUDE 的东西,但我还不知道它是否对我有帮助。有什么更简单的方法可以做到这一点吗?

$ceo = 2;
$sql = $connection->prepare("SELECT id, name, email, admin, position, blocked, deleted FROM workers WHERE email!=? AND admin!=?");
$sql->bind_param("si", $_SESSION['user'], $ceo);
$sql->execute();
$users_listdb = $sql->get_result()->fetch_assoc();

$ _SESSION['user'] 包含任何授权用户的电子邮件地址。

【问题讨论】:

  • 你到底想用这个查询做什么,你的问题是什么?
  • 此查询显示用户列表,不包括主管理员和查看列表的常规管理员。问题在主要问题中有所描述。是否可以修改此请求以另外从管理员列表中删除其他常规管理员,但将绝对所有用户的显示保留给主管理员?我希望我说得更清楚。
  • 当然,只需对管理员和主管理员使用不同的查询,或者作为替代选择所有用户(管理员列上没有条件)并根据当前用户的访问级别在 PHP 中将它们过滤掉。

标签: php sql prepared-statement


【解决方案1】:

您可以只使用if 语句来根据用户的级别更新 SQL 查询。

假设用户已登录并且用户的 id 是一个$id 变量。

// User ID's 
$main_admin_id = 2;
$admin_id = 1;
$user_id = 0;

$sql = "SELECT id, name, email, admin, position, blocked, deleted FROM workers WHERE email != ?";
if ($id == 1) $sql .= ' AND (admin = ? OR admin = ?)';
else if ($id == 0) $sql .= ' AND admin = ?';

$stmt = $connection->prepare($sql);

if ($id == 0) $stmt->bind_param('si', $_SESSION['user'], $user_id);
else if ($id == 1) $stmt->bind_param('sii', $_SESSION['user'], $main_admin_id, $admin_id);
else $stmt->bind_param('s', $_SESSION['user']);

$stmt->execute();
$users_listdb = $sql->get_result()->fetch_assoc();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多