CodeIgniter多用户登录时出现"Trying to get property of non-object"错误求助
解决登录错误输入时的"Trying to get property of non-object"问题
嘿,这个问题我之前也踩过坑!本质就是输入错误信息时,代码还在硬着头皮访问一个根本不存在的对象属性,下面给你一步步拆解解决:
错误原因分析
正常登录时,你的Model能查询到匹配的用户,返回一个有效的对象,所以访问属性完全没问题;但输入错误的账号/密码时,Model查不到对应数据,返回了null或者false(不是对象),而Controller第34行的代码还在像访问对象一样读取它的属性,直接触发了这个错误。
具体修复步骤
1. 先确认Model的查询逻辑
看一下你用来查询用户的Model代码,比如类似这样:
// 示例Model查询方法 public function findUserByEmail($email) { return $this->where('email', $email)->first(); }
当没有匹配用户时,first()会返回null,这是正常行为,但你需要确保Controller能正确处理这个返回值。
2. 重点修正Controller的登录逻辑(针对第34行)
假设第34行是类似$user->id或者$user->username这类代码,你必须在访问属性前先判断$user是不是有效的对象:
// ❌ 错误写法:没校验用户是否存在就访问属性 $user = User::where('email', $request->email)->first(); if (Hash::check($request->password, $user->password)) { // 正常登录跳转逻辑 } else { // 这里如果$user是null,访问$user->password直接报错! return back()->withErrors('登录失败'); } // ✅ 正确写法:先确认用户存在,再校验密码 $user = User::where('email', $request->email)->first(); if ($user && Hash::check($request->password, $user->password)) { // 用户存在且密码正确,执行登录跳转 auth()->login($user); return redirect()->to('/target-page'); } else { // 用户不存在或密码错误,直接返回提示,绝不碰$user的属性 return back()->withErrors(['login' => '邮箱或密码错误']); }
核心原则就是:永远不要在不确定变量是对象的情况下,直接访问它的属性。
3. 快速调试小技巧
如果还是摸不准问题在哪,在第34行之前加一行调试代码:
dd($user); // 打印$user的值,错误输入时你会发现它是null
一眼就能确认变量类型,精准定位问题。
内容的提问来源于stack exchange,提问作者Tahmid-ni7
相关产品推荐
相关产品推荐

