CodeIgniter用户邮箱修改功能失效,提交表单报非对象属性错误
问题分析与解决方案
首先,你遇到的Trying to get property of non-object错误,根源在于当数据库查询没有匹配到用户时,$query->row()会返回null,这时候直接访问$user->user_id就会触发这个Notice错误,后续的邮箱更新逻辑自然也不会执行,导致邮箱没更新。
具体问题点
- 查询结果未做判空处理:当用户输入的密码不正确,或者会话中的
user_id无效时,查询不会返回任何用户数据,$user变为null,直接访问$user->user_id必然报错。 - 参数获取不够规范:你直接使用
$_POST['wachtwoord']和$_SESSION['user_id'],虽然能运行,但CodeIgniter提供了更安全的$this->input->post()和$this->session->userdata()方法,建议统一使用以契合框架规范。
修复后的控制器代码
<?php class GwController extends CI_Controller { public function index() { $this->load->view('gegevenswijzigen'); } function __construct() { parent::__construct(); // 加载更新模型 $this->load->model('Update_model'); // 确保会话库可用 $this->load->library('session'); } // 修改用户邮箱的控制器方法 function update_email() { // 用框架内置方法获取参数,提升安全性 $userId = $this->session->userdata('user_id'); $newEmail = $this->input->post('email'); $password = $this->input->post('wachtwoord'); // 验证必要参数是否存在 if(empty($userId) || empty($newEmail) || empty($password)){ // 参数缺失时跳转回修改页面 redirect('GwController/index'); return; } // 查询用户,验证密码正确性 $this->db->select('*'); $this->db->from('users'); $this->db->where(array( 'user_id' => $userId, 'wachtwoord' => $password )); $query = $this->db->get(); // 先判断查询是否有结果,再操作用户对象 if ($query->num_rows() > 0) { $data = array('email' => $newEmail); // 调用模型执行邮箱更新 $this->Update_model->update_email($userId, $data); // 跳转回个人资料页 redirect('user/profile'); } else { // 密码错误或用户不存在时,添加错误提示 $this->session->set_flashdata('error', '密码不正确,请重试'); redirect('GwController/index'); } } }
模型代码的小优化
模型逻辑可以保留,但建议用框架会话类更新会话值,更符合规范:
<?php class Update_model extends CI_Model{ // 更新用户邮箱的模型方法 function update_email($id,$data){ $this->db->where('user_id', $id); $this->db->update('users', $data); // 使用框架会话类更新邮箱会话值 $this->session->set_userdata('email', $data['email']); } }
视图代码的小调整
用框架的form_open生成表单,同时用会话类传递user_id:
<?php echo form_open('GwController/update_email'); ?> <tr> <td><h4>E-mail adres wijzigen</h4></td> <td><?php echo form_input(array( 'type'=>'email', 'id'=>'email', 'name'=>'email', 'placeholder' => 'Nieuw e-mail adres:', 'size'=>70 ));?></td> <td><?php echo form_input(array( 'type'=>'password', 'id'=>'wachtwoord', 'name'=>'wachtwoord', 'placeholder' => 'Uw wachtwoord:', 'size'=>70 ));?></td> <td><?php echo form_hidden('user_id', $this->session->userdata('user_id'));?></td> <td><button type="submit" name="emailwijzigen" class="btn btn-primary">Opslaan</button></td> </tr> <?php echo form_close(); ?>
关键修复说明
- 通过
$query->num_rows() > 0先判断查询是否有结果,避免访问null对象的属性,彻底解决Notice错误。 - 使用CodeIgniter内置的
input和session类处理参数与会话,提升代码安全性和兼容性。 - 添加参数空值验证,防止因缺少必要参数导致的逻辑异常。
- 增加错误提示逻辑(借助flashdata),优化用户体验。
这样修改后,不仅能解决你遇到的错误,还能让邮箱更新逻辑正常执行,代码也更贴合CodeIgniter的最佳实践。
内容的提问来源于stack exchange,提问作者jonyy
相关产品推荐
相关产品推荐

