使用Model查询结果时出现Undefined array key错误求助
问题分析与解决
问题根源
你打印的$data结果是:
[{"key0":"2","key1":"admin","key2":"User Admin","key3":"***","key4":"1","tracker_createdat":"2023-07-03 08:12:42"}]
这是一个外层为数字索引的数组,里面的第0个元素才是包含用户信息的关联数组。你直接调用$data["key1"]会报错,因为外层数组的键是0,不存在"key1"这个键。
解决方案
有两种可行的修改方式:
方式一:修改控制器,获取数组内的单个用户记录
在打印$data之后,添加一行代码取出数组的第一个元素,再访问对应的键,同时修正字段对应错误:
public function loginVerify() { $session = session(); $userModel = new UserModel(); $username = $this->request->getVar('key1'); $password = $this->request->getVar('key2'); $data = $userModel->getLoginSession($username); // $data = $userModel->getLoginSession()->where('key1', $username)->first(); if(!empty($data)) { // 替换isset为!empty,避免空数组误判 echo json_encode($data); $data = $data[0]; // 取出数组内的用户记录 $pass = $data["key3"]; // 密码对应key3字段,别误取用户名 $authenticatePassword = password_verify($password, $pass); if($authenticatePassword){ $ses_data = [ 'id' => $data['key0'], // 用户ID对应key0字段 'username' => $data['key1'], // 用户名对应key1字段 'name' => $data['key2'], // 用户名称对应key2字段 'isLoggedIn' => TRUE ]; $session->set($ses_data); return redirect()->to('/users-list'); }else{ $session->setFlashdata('msg', 'Password is incorrect.'); return redirect()->to('/login'); } }else{ $session->setFlashdata('msg', 'Email does not exist.'); return redirect()->to('/login'); } }
方式二:修改Model的getLoginSession方法,返回单个记录
如果你的getLoginSession方法当前返回的是多条记录的集合(比如用了findAll()),修改它使用first()返回单个匹配的记录:
// 示例Model方法修改 public function getLoginSession($username) { return $this->where('key1', $username)->first(); }
这样控制器里的$data直接就是单个关联数组,不需要额外取索引,可以直接访问$data["key1"]。
额外提示
- 用
!empty($data)替代isset($data),因为isset($data)对于空数组也会返回true,无法正确判断是否查询到用户。 - 务必确认字段对应关系,避免像原代码那样把用户名当成密码取的错误。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

