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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:00:56