【问题标题】:Using Aggregate String Functions in MySQL and PHP在 MySQL 和 PHP 中使用聚合字符串函数
【发布时间】:2019-10-08 12:22:02
【问题描述】:

我目前遇到一个问题,我有一个名为“Privilege”的枚举,其中 0 = 正常,1 = 特权。这些被分配给工作,例如worker 有正常权限,但是 CEO 有 admin 权限。我遇到的一个问题是用户可能有两个工作,一个是普通特权,另一个是管理员特权。我写了一个查询,以便根据权限启动会话,但是当我使用按 StaffID 分组时,我不确定如何按最高权限分组(1 是这种情况)。

例如

else if ($pwdCheck == True){
    session_start();
    $query = mysqli_query($conn, 'SELECT staff.StaffID, role.Privilege FROM jobs
         INNER JOIN staff ON staff.StaffID = jobs.StaffID
         INNER JOIN role ON role.RoleID = jobs.RoleID GROUP BY StaffID
    ');

    $gettier = mysqli_fetch_assoc($query);
    if($gettier["Privilege"] === 'normal'){
        $_SESSION['userID'] = $row['LoginID'];
        header("Location: staffindex.php?login=USERsuccess");
    }
    elseif($gettier["Privilege"] === 'privileged'){
        $_SESSION['AdminID'] = $row['LoginID'];
        header("Location: staffindex.php?login=ADMINsuccess");
    }
    exit();
}

这是在所有情况下,当我输入一个特权人员时,我仍然会被 USERsuccess 标头重定向。我假设我需要使用聚合字符串函数(经过一些研究),但我真的不明白如何应用它。

请查看图片以查看实际查询:
分组:https://imgur.com/ADT0aHF
无分组:https://imgur.com/UDeyKe5

感谢任何帮助。

【问题讨论】:

标签: php mysql sql session aggregate


【解决方案1】:

不幸的是,MySQL 不会对 enum 值进行数字排序,而是按其字符串表示形式排序,否则您可以直接在值上使用 MAX。但是您可以通过CAST将值作为整数进行排序,例如

SELECT staff.StaffID, MAX(CAST(role.Privilege AS UNSIGNED)) AS Privilege FROM jobs
INNER JOIN staff ON staff.StaffID = jobs.StaffID
INNER JOIN role ON role.RoleID = jobs.RoleID GROUP BY StaffID

假设您的 ENUM 具有值 ('normal', 'privileged'),这将为仅具有 normal 特权的用户返回 1 值,对于仅具有 privileged 特权或两者兼有 @987654332 的用户返回 2 @ 和 privileged。然后,您可以将 PHP 中的检查更改为:

if($gettier["Privilege"] == 1){
    $_SESSION['userID'] = $row['LoginID'];
    header("Location: staffindex.php?login=USERsuccess");
}
elseif($gettier["Privilege"] == 2){
    $_SESSION['AdminID'] = $row['LoginID'];
    header("Location: staffindex.php?login=ADMINsuccess");
}

请注意,您不能使用 ===$gettier["Privilege"] 进行比较,因为查询返回的值将是字符串,而不是整数。

【讨论】:

  • 这是超级的,但是这会返回一个错误,其中 Privilege 是一个未定义的索引?
  • @GoGoAllen 抱歉,忘记为该值提供别名。查看我的编辑
  • 嗯,这似乎仍然不起作用 - 这样做会创建一个没有重定向的空白页面。我在两个语句中都添加了 ((int)$gettier["Privilege"]),但是它仍然重定向到 USERsuccess。
  • @GoGoAllen 数据库代码工作正常 - 请参阅此演示 dbfiddle.uk/…。 PHP 将值作为字符串返回,这就是 === 失败的原因,但转换为 int 应该可以解决这个问题。如果你echo $gettier["Privilege"];,你会得到什么?
  • 查询似乎是所有商品 - 我使用 error_log(print_r($gettier,true)); 运行 if 语句最后它返回:“Array\n(\n [StaffID] => 1\n [Privilege] => 1\n)\n, referer: {localhost location}”
猜你喜欢
  • 2016-12-06
  • 2010-09-27
  • 1970-01-01
  • 2016-11-04
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多