CodeIgniter4中MySQL博客浏览量递增数值异常问题求助
解决CodeIgniter4博客浏览量每次递增2倍的问题
你的核心问题是浏览量更新逻辑被执行了两次,所以才会出现2、4、6或2、6、10这类翻倍增长的情况,以下是具体排查和解决步骤:
一、先确认请求次数
打开浏览器开发者工具(F12),切换到「网络」标签,刷新博客详情页,查看请求列表:
- 如果发现有两个相同的博客详情请求(比如两次
/blog/1),说明页面触发了重复请求,这是最常见的原因。
常见重复请求的诱因及解决:
- 缺失favicon.ico导致的额外请求:浏览器会默认请求站点根目录的
favicon.ico,如果你的项目没有这个文件,且路由将404请求重定向到了博客详情控制器,就会触发二次更新。
解决:在项目根目录放置一个favicon.ico文件,或者在app/Config/Routes.php里添加路由规则,单独处理favicon请求:$routes->get('favicon.ico', static function() { return null; }); - 视图中的无效资源引用:比如模板里引用了不存在的图片、CSS或JS文件,浏览器请求这些资源时,服务器路由错误地指向了博客详情控制器,导致二次执行更新逻辑。
解决:检查视图文件里的所有资源路径,确保引用的文件存在,或者添加404页面路由,避免无效请求触发业务逻辑。
二、检查控制器代码的执行时机
- 确保浏览量更新的代码只在控制器的目标方法中执行一次,比如不要把更新逻辑写在控制器的构造函数里,也不要在多个方法里重复调用这段代码。
正确的代码位置示例:public function detail($id) { // 仅在这里执行浏览量更新 $db = \Config\Database::connect(); $builder = $db->table('blog'); $builder->set('view', 'view+1', FALSE); $builder->where('id', $id); $builder->update(); // 后续是获取博客数据、加载视图的逻辑 $data['blog'] = $builder->where('id', $id)->get()->getRow(); return view('blog/detail', $data); }
三、排除并发或代码逻辑问题
你的第一种写法(原子更新)是正确的,能避免并发场景下的数值错误,但如果执行两次还是会加两次。可以做个简单测试:
- 暂时注释掉加载视图的代码,只保留更新浏览量的逻辑,然后刷新页面,观察数据库数值是否每次加1。如果正常,说明问题出在视图文件里;如果还是翻倍,检查路由配置是否有重复指向。
内容的提问来源于stack exchange,提问作者Araf HR
相关产品推荐
相关产品推荐

