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

RedBeanPHP页面刷新时view字段未自动+1,求助解决

解决RedBeanPHP页面刷新更新posts表view字段无效的问题

你的代码存在几个关键错误,导致view字段无法正常更新,以下是问题分析和修正方案:

问题点解析

  1. SQL字段引用错误:原语句中view = "view" + 1的双引号会让数据库把view当作字符串处理,最终执行的是字符串拼接而非数值相加,这会导致计算结果不符合预期。
  2. 变量未正确解析:单引号包裹的SQL语句里,$posts["id"]不会被PHP解析为实际ID值,数据库收到的是字面量$posts["id"],自然无法匹配到对应数据行。
  3. Session逻辑颠倒:原代码仅当$_SESSION['recent_posts']存在时才更新计数,这会导致首次访问(Session未初始化)时不统计浏览量;正确逻辑应该是用户未在当前会话中浏览过该文章才更新,避免重复刷新重复计数。
  4. SQL注入风险:直接将变量拼入SQL语句存在安全隐患。

修正方案

方案一:使用RedBeanPHP对象操作(推荐)

这是RedBean框架的标准用法,更简洁安全:

$post_id = $_GET['post_id'];
$post = R::load('posts', $post_id);

// 初始化浏览记录Session数组
if (!isset($_SESSION['recent_posts'])) {
    $_SESSION['recent_posts'] = [];
}

// 会话内未浏览过该文章才更新计数
if (!in_array($post_id, $_SESSION['recent_posts'])) {
    // 处理view字段为null的情况,默认从0开始计数
    $post->view = ($post->view ?? 0) + 1;
    // 保存更新到数据库
    R::store($post);
    // 将当前文章ID加入会话记录,避免重复计数
    $_SESSION['recent_posts'][] = $post_id;
}

方案二:修正R::exec方法(带参数绑定)

如果坚持使用原生SQL更新,需修复语法并加入参数绑定:

$post_id = $_GET['post_id'];
$post = R::load('posts', $post_id);

if (!isset($_SESSION['recent_posts'])) {
    $_SESSION['recent_posts'] = [];
}

if (!in_array($post_id, $_SESSION['recent_posts'])) {
    // 使用参数绑定传递ID,避免注入问题和变量解析错误
    R::exec('UPDATE posts SET view = view + 1 WHERE id = ?', [$post->id]);
    $_SESSION['recent_posts'][] = $post_id;
}

内容的提问来源于stack exchange,提问作者Taras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:31:35