CodeIgniter框架中Colaborador控制器index方法执行时意外插入数据库记录的问题求助
排查与解决自动插入数据库记录的异常问题
让我们一步步拆解这个奇怪的问题——明明只调用了Colaborador->index(),却自动插入了6条记录,而且插入逻辑只应该在点击注册按钮触发cadastrarquestao()时执行。以下是具体的排查方向和解决思路:
1. 检查模板及子视图是否意外触发插入逻辑
你的index()方法只是加载了模板和app/enviar-questao视图,但模板里还嵌套加载了app/header、app/topo、app/menu这些子视图。这些子视图里很可能隐藏了触发插入的代码:
- 打开这几个子视图文件,看看有没有直接调用
$this->simulado->envioquestao()的PHP代码; - 检查是否有表单设置了
autosubmit属性,或者通过JS自动提交了指向colaborador/cadastrarquestao的请求; - 甚至可能是子视图里的某个资源URL写错了(比如图片、脚本路径),误指向了
cadastrarquestao接口,导致浏览器加载页面时多次发送请求触发插入。
2. 排查全局钩子与权限控制库的间接触发
在Colaborador的构造函数里,你调用了$this->controle_acesso->acesso();,同时也要检查CodeIgniter的全局钩子配置:
- 打开
application/config/hooks.php,看看有没有配置在控制器方法执行前后自动运行的钩子脚本,这些脚本会不会间接调用了envioquestao(); - 查看
controle_acesso库的acesso()方法源码,确认它是否在权限验证过程中意外触发了simulado模型的插入逻辑。
3. 利用Profiler和日志定位调用次数
你已经开启了CodeIgniter的Profiler($this->output->enable_profiler(TRUE);),可以直接通过它来分析:
- 查看Profiler中的Queries板块,找到
INSERT INTO teste语句,看看它执行了几次,每次执行的上下文信息; - 为了更精准追踪,在
simulado_model->envioquestao()方法里添加日志代码:
然后打开public function envioquestao($dados) { log_message('debug', 'envioquestao被触发!用户ID:'.$this->session->userdata('id_usuario')); $data = [ 'Id_usuario' => $this->session->userdata('id_usuario'), ]; $this->db->insert('teste',$data); }application/logs下的日志文件,就能看到这个方法被调用了几次,以及调用的时间点,帮你定位触发源头。
4. 检查路由配置是否有误
打开application/config/routes.php,确认没有错误的路由规则把index请求导向了cadastrarquestao:
- 比如有没有类似
$route['colaborador'] = 'colaborador/cadastrarquestao';这种错误配置,导致访问colaborador/index时实际执行了cadastrarquestao方法。
5. 排查浏览器端的自动请求
打开浏览器开发者工具(F12),切换到Network标签,然后刷新页面:
- 观察所有请求,看看是否有6次指向
colaborador/cadastrarquestao的请求; - 如果有,检查请求的发起者是哪个资源(比如脚本、图片、iframe),修正对应的URL即可。
总结思路
因为envioquestao()每次调用只会插入1条记录,现在出现6条,说明这个方法被调用了6次。核心就是找到谁在调用这个方法——从模板子视图、全局逻辑、路由、浏览器请求这几个方向逐一排查,很快就能定位问题啦。
内容的提问来源于stack exchange,提问作者lelopes
相关产品推荐
相关产品推荐

