You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP函数内为变量赋值数据库查询返回的roles字段值

实现方案

你当前编写的find_user_by_username函数已经通过PDO::FETCH_ASSOC返回了包含username/password/roles三个字段的关联数组,不需要修改原查询函数,按以下步骤取值做权限判断即可:

1. 接收查询返回的用户数据

调用函数时用变量接住返回结果,先做非空判断避免查无用户时触发报错:

// 传入用户提交的用户名参数调用查询函数
$current_user = find_user_by_username($submit_username);
if (!$current_user) {
    // 此处写用户不存在的处理逻辑,比如返回用户名错误、跳转登录页
    exit('账号不存在');
}

2. 提取roles字段赋值

直接通过关联数组键名就能拿到roles字段值,建议做空兼容处理:

// 拿到roles值,不存在时默认赋空字符串
$user_roles = $current_user['roles'] ?? '';

根据你数据库中roles字段的存储格式,按需解析成可判断的格式:

  • 单角色字符串存储(如admin/normal):直接使用即可
  • 逗号分隔多角色存储(如admin,editor):用$role_arr = explode(',', $user_roles)拆分为数组
  • JSON格式多角色存储(如["admin","editor"]):用$role_arr = json_decode($user_roles, true)转为PHP数组

3. 管理员权限判断

单角色场景示例

$is_admin = ($user_roles === 'admin');
if (!$is_admin) {
    exit('无管理员访问权限');
}
// 后续放管理员可执行的业务逻辑

多角色场景示例

// 先按存储格式把roles解析为数组,再判断是否包含管理员标识
$role_arr = explode(',', $user_roles);
$is_admin = in_array('admin', $role_arr);
if (!$is_admin) {
    exit('无管理员访问权限');
}

优化建议

  • 保持find_user_by_username函数的单一职责,不要把权限判断逻辑写在这个查询函数里,后续调整角色规则时不需要改动数据库查询层代码,维护性更高
  • 权限判断逻辑建议封装成独立的公共函数,避免多个页面重复写判断代码
  • 如果roles字段支持为空,一定要加?? ''的空兼容处理,避免触发数组键不存在的报错

内容的提问来源于stack exchange,提问作者Pul96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:12:17