SESSION变量Unset触发过早,导致游戏反馈信息无法显示的问题求助
解决POST Redirect模式下SESSION变量过早消失的问题
兄弟,我太懂你这糟心的问题了——本来想用POST Redirect模式避免重复提交,结果SESSION变量总是莫名其妙提前消失,连个提示信息都看不到,简直让人挠头!别慌,咱们一步步捋清楚问题出在哪,再给你一套靠谱的解决方案。
核心问题分析
你遇到的本质问题是SESSION变量的销毁时机不对:要么在设置完SESSION就立刻unset(重定向后页面根本读不到),要么在展示页面还没显示内容就先unset了,自然看不到提示。PRG模式的关键是:在处理POST的页面只存SESSION,重定向到展示页面后先读、再显示、最后销毁。
正确的实现步骤
首先要记住:所有用到SESSION的页面,第一行必须加session_start();,否则SESSION根本没法正常工作!
1. 处理POST请求的页面(比如process_shot.php)
这个页面只负责处理游戏逻辑、设置SESSION,然后立刻重定向,绝对不要在这里unset任何SESSION变量!
示例代码:
session_start(); // 模拟玩家选择和电脑随机落点 $player_target = $_POST['target'] ?? ''; $computer_shot = rand(1, 4); // 假设落点是1-4的位置 // 判断命中情况,设置SESSION if ($player_target == $computer_shot) { $_SESSION['game_notice'] = "做得好!"; $_SESSION['arrow_img'] = "hit_location.png"; // 替换成你的命中图片路径 } else { $_SESSION['game_notice'] = "未命中,箭头落在别处"; $_SESSION['arrow_img'] = "miss_location.png"; // 替换成你的未命中图片路径 } // 重定向到游戏主页面,一定要加exit终止后续代码执行 header("Location: game.php"); exit;
2. 游戏展示页面(比如game.php)
这个页面是玩家看到的主界面,逻辑顺序是:先检查SESSION是否存在 → 显示提示和图片 → 立刻销毁对应的SESSION变量,这样刷新页面后内容就会消失。
示例代码:
session_start(); // 检查SESSION变量是否存在,存在就显示内容 if (isset($_SESSION['game_notice']) && isset($_SESSION['arrow_img'])) { // 显示提示信息 echo "<p>" . $_SESSION['game_notice'] . "</p>"; // 显示箭头落点图片 echo "<img src='" . $_SESSION['arrow_img'] . "' alt='箭头落点' />"; // 显示完成后,立刻销毁这些SESSION变量! unset($_SESSION['game_notice']); unset($_SESSION['arrow_img']); } // 下面放游戏的核心交互:选择落点的表单 ?> <form method="POST" action="process_shot.php"> <h3>选择箭头落点:</h3> <div> <label><input type="radio" name="target" value="1" /> 位置1</label> <label><input type="radio" name="target" value="2" /> 位置2</label> <label><input type="radio" name="target" value="3" /> 位置3</label> <label><input type="radio" name="target" value="4" /> 位置4</label> </div> <button type="submit">发射箭头</button> </form>
你可能踩过的坑
- ❌ 在处理POST的页面设置完SESSION就unset:重定向后页面读取时SESSION已经没了,当然看不到内容。
- ❌ 在展示页面开头就unset SESSION:还没显示内容就把变量删了,自然啥都看不到。
- ❌ 忘记加
session_start();:SESSION无法正常存储或读取,等于白设置。
内容的提问来源于stack exchange,提问作者MelC
相关产品推荐
相关产品推荐

