如何在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
相关产品推荐
相关产品推荐

