RedBeanPHP页面刷新时view字段未自动+1,求助解决
解决RedBeanPHP页面刷新更新posts表view字段无效的问题
你的代码存在几个关键错误,导致view字段无法正常更新,以下是问题分析和修正方案:
问题点解析
- SQL字段引用错误:原语句中
view = "view" + 1的双引号会让数据库把view当作字符串处理,最终执行的是字符串拼接而非数值相加,这会导致计算结果不符合预期。 - 变量未正确解析:单引号包裹的SQL语句里,
$posts["id"]不会被PHP解析为实际ID值,数据库收到的是字面量$posts["id"],自然无法匹配到对应数据行。 - Session逻辑颠倒:原代码仅当
$_SESSION['recent_posts']存在时才更新计数,这会导致首次访问(Session未初始化)时不统计浏览量;正确逻辑应该是用户未在当前会话中浏览过该文章才更新,避免重复刷新重复计数。 - 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
相关产品推荐
相关产品推荐

