PHP CodeIgniter登录后如何正确输出用户名等会话用户数据
故障根因
- 数据库查询结果取值写法错误:你调用
result_array()方法拿到的是纯数组结构的结果集,不是对象,用$result->username这种对象属性取值方式,根本获取不到用户名字段值,自然没法写入session。 - session操作写法混用:给
user_id赋值用的是CodeIgniter框架自带的session类方法,给username赋值却直接操作原生$_SESSION全局变量,CI重定向时会触发框架session的写入逻辑,两种混用很容易导致原生写入的值被覆盖、丢失。
修复方案
1. 修正控制器登录逻辑的session赋值部分
把原来登录成功块里的代码替换为以下内容:
if ($query->num_rows()){ // 直接取单行结果数组,无需额外取[0]下标 $user_info = $query->row_array(); // 统一用框架session方法批量写入用户信息,不要混写原生$_SESSION $this->session->set_userdata([ 'user_id' => $user_info['uid'], 'username' => $user_info['username'] ]); redirect('admin/dashboard'); }
2. 修正视图层的session读取写法
不要直接读取原生$_SESSION变量,统一用框架提供的session方法读取,避免读取不到值,视图代码修改为:
<h1>Hi <?php echo $this->session->userdata('user_id');?></h1> <h1>Hi <?php echo $this->session->userdata('username');?></h1>
其他优化建议
- 提前在
application/config/autoload.php配置中自动加载session库,避免漏加载导致session异常:$autoload['libraries'] = array('session'); - 现有SQL语句直接拼接前端传入的
$email、$password参数,存在严重SQL注入风险,建议改用CI查询构造器或参数绑定写法。 - 密码明文存储在数据库中存在安全隐患,建议使用
password_hash()对密码做哈希后存储,登录时用password_verify()做校验。
内容的提问来源于stack exchange,提问作者javax
相关产品推荐
相关产品推荐

