PHP数组报错:Attempt to read property 'id' on array 解决方法
错误分析与解决方案
错误原因
你遇到的 Attempt to read property 'id' on array 错误,核心原因是尝试对数组(或非对象类型)使用对象属性访问语法 ->id,同时代码中存在几处明显的逻辑错误和拼写问题:
1. 无效的 $ion_user_id 赋值逻辑
原代码中这一段完全错误:
$ion_user_id = $this->db->get_where('users', array('email' => $email))->row()->id; if ($ion_user_id) { $ion_user_id = $ion_user_id->row()->id; }
第一行已经把 users 表中用户的 id 值(整数类型)赋值给了 $ion_user_id,但第二行又试图对这个整数调用 ->row()->id,相当于对非对象类型使用对象访问语法,直接触发错误。
2. 表名字符拼写错误
$patient_user_id = $this->db->get_where('pa;tient', array('email' => $email))->row()->id;
表名写成了 pa;tient(多了个分号),导致查询无结果,row() 返回 null,后续访问 ->id 也会触发类似错误。
3. 未检查查询结果是否存在
所有使用 ->row()->xxx 的地方都没有先判断 row() 是否返回有效对象,一旦查询无结果,就会出现属性访问错误。
修复后的代码片段
$username = $this->input->post('name'); if (empty($id)) { // 添加新患者 if ($this->ion_auth->email_check($email)) { $this->session->set_flashdata('feedback', 'Cette adresse email est déjà enregistré dans la base données'); redirect('patient/addNewView'); } else { $dfg = 5; $this->ion_auth->register($username, $password, $email, $dfg); // 正确获取用户ID:先取行对象,再判断是否存在 $user_row = $this->db->get_where('users', array('email' => $email))->row(); if (!$user_row) { $this->session->set_flashdata('feedback', 'Erreur lors de la création du compte utilisateur'); redirect('patient/addNewView'); } $ion_user_id = $user_row->id; $this->patient_model->insertPatient($data); // 修复表名拼写错误,并检查查询结果 $patient_row = $this->db->get_where('patient', array('email' => $email))->row(); if (!$patient_row) { $this->session->set_flashdata('feedback', 'Erreur lors de l\'enregistrement du patient'); redirect('patient/addNewView'); } $patient_user_id = $patient_row->id; $id_info = array('ion_user_id' => $ion_user_id); $this->patient_model->updatePatient($patient_user_id, $id_info); $this->hospital_model->addHospitalIdToIonUser($ion_user_id, $this->hospital_id); if (!empty($sms)) { $this->sms->sendSmsDuringPatientRegistration($patient_user_id); } $this->session->set_flashdata('feedback', 'Ajouté'); } } else { // 更新患者信息 // 先检查患者是否存在 $patient_row = $this->db->get_where('patient', array('id' => $id))->row(); if (!$patient_row) { $this->session->set_flashdata('feedback', 'Patient introuvable'); redirect('patient'); } $ion_user_id = $patient_row->ion_user_id; if (empty($password)) { $user_row = $this->db->get_where('users', array('id' => $ion_user_id))->row(); if ($user_row) { $password = $user_row->password; } else { $this->session->set_flashdata('feedback', 'Compte utilisateur introuvable'); redirect('patient'); } } else { $password = $this->ion_auth_model->hash_password($password); } $this->patient_model->updateIonUser($username, $email, $password, $ion_user_id); $this->patient_model->updatePatient($id, $data); $this->session->set_flashdata('feedback', 'Modifié'); } // 页面跳转 if (!empty($redirect)) { redirect('finance/addPaymentView'); } else { redirect('patient'); }
关键修复点总结
- 修正表名拼写:把
pa;tient改为patient - 重构用户ID获取逻辑:先获取查询行对象,判断存在后再提取属性
- 增加空值检查:所有数据库查询后都判断结果是否有效,避免对
null或非对象调用属性 - 移除无效的重复赋值:删除
$ion_user_id = $ion_user_id->row()->id这一行错误代码
内容的提问来源于stack exchange,提问作者Oli
相关产品推荐
相关产品推荐

