You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:13:25