CodeIgniter3 Ajax提交控制器问题:点击按钮无法更新数据库
排查通知标记已读功能的数据库更新问题
咱们一步步拆解问题,从代码细节里找原因:
1. 控制器核心变量未初始化,导致模型接收无效参数
你的控制器方法read_notif()里直接使用了$data['id'],但这个变量完全没有被定义或赋值!这会导致模型接收到的$id是null,WHERE recipient = $id的条件根本匹配不到任何数据,自然不会更新数据库。
你需要先获取当前登录用户的ID,比如从会话中读取(根据你项目的实际用户认证方式调整):
public function read_notif(){ // 假设用CodeIgniter的session存储用户ID,替换成你项目的实际取值方式 $user_id = $this->session->userdata('user_id'); if($user_id){ $this->profile_model->read_notifs($user_id); } return; }
2. Ajax请求缺少调试反馈,无法确认请求状态
当前的Ajax代码没有任何成功/失败回调,你完全不知道请求是否真的到达了控制器、有没有报错。加上回调函数,用浏览器开发者工具就能快速定位问题:
$('#noti_Button').click(function (e) { e.preventDefault(); $.ajax({ url: '<?php echo site_url("profile/read_notif")?>', type: 'GET', // 若你的路由限制POST,可改为POST success: function(response) { console.log('请求成功,响应内容:', response); // 这里可以加UI反馈,比如更新通知小红点数量 }, error: function(xhr, status, error) { console.error('请求出错:', status, error); console.log('服务器返回详情:', xhr.responseText); } }); });
打开浏览器F12的「Console」和「Network」标签,就能看到请求的状态码、服务器返回的报错信息。
3. 模型可添加执行结果返回,方便验证更新效果
修改模型方法,返回受影响的行数,能直观确认是否有数据被更新:
function read_notifs($id) { if(empty($id)) return 0; // 先校验ID有效性 $read = array( 'read' => '1' ); $this->db->where('recipient', $id); $this->db->update('tbl_notifications', $read); return $this->db->affected_rows(); // 返回更新的行数 }
然后控制器可以把结果返回给前端:
public function read_notif(){ $user_id = $this->session->userdata('user_id'); $affected_rows = 0; if($user_id){ $affected_rows = $this->profile_model->read_notifs($user_id); } echo json_encode(array('updated_count' => $affected_rows)); return; }
这样前端的success回调里就能看到到底更新了几条数据。
4. 额外验证点
- 路由与权限:直接在浏览器地址栏访问
site_url("profile/read_notif")生成的URL,看是否能正常执行、有没有PHP报错(比如模型未加载、权限限制)。 - 数据库数据匹配:手动执行SQL测试,确认存在符合条件的记录:
查看是否有行数被影响,排除数据本身不匹配的问题。UPDATE tbl_notifications SET `read` = '1' WHERE recipient = '你的测试用户ID';
按以上步骤排查,应该就能快速定位并解决问题了!
内容的提问来源于stack exchange,提问作者geek_10101010
相关产品推荐
相关产品推荐

