PHP使用isset校验$_POST提交表单后刷新页面验证结果不消失问题
问题成因
你遇到的现象是浏览器的正常行为:当你提交POST表单后刷新页面,选择「确认表单重新提交」时,浏览器会把上次提交的POST数据再次发送给服务端,此时$_POST里的参数依然存在,isset()判断自然会通过,所以输出的提示内容会重复出现。
纯PHP无JS解决方案
使用标准的POST-Redirect-GET(PRG) 模式即可解决,核心逻辑是:POST请求只用来处理表单校验,处理完成后马上重定向到当前页面的GET请求,校验结果存在session中临时存储,页面加载GET请求时读取session展示结果,展示后立即清空session。
完整修改后的value.php代码:
<?php // 顶部先开启session,必须在任何输出之前调用 session_start(); $db_fruit = 'apple'; $db_vegetable = 'tomato'; $result = ''; // 处理POST提交逻辑 if (isset($_POST['fruit']) && isset($_POST['vegetable'])) { $fruit = htmlentities($_POST['fruit']); $vegetable = htmlentities($_POST['vegetable']); if (!empty($fruit) && !empty($vegetable)) { if ($fruit == $db_fruit && $vegetable == $db_vegetable) { $_SESSION['check_result'] = 'The values do match.'; } else { $_SESSION['check_result'] = 'The values do not match.'; } } // 处理完成后重定向到当前页面,终止后续执行 header('Location: value.php'); exit; } // GET请求下读取session中的结果,读取后立即销毁 if (isset($_SESSION['check_result'])) { $result = $_SESSION['check_result']; unset($_SESSION['check_result']); } ?> <!-- 输出校验结果 --> <?php if ($result): ?> <p><?php echo $result; ?></p> <?php endif; ?> <!-- 表单代码 --> <form action="value.php" method="POST"> <input type="text" name="fruit" placeholder="FRUIT HERE"><br> <input type="text" name="vegetable" placeholder="VEGETABLE HERE"> <button type="submit">CHECK</button> </form>
方案效果说明
- 提交表单后会自动跳转回当前页面,浏览器不会再弹出「表单重新提交」的提示
- 刷新页面时是纯GET请求,session中的校验结果已经被清空,页面直接回到初始无提示的状态,完全符合需求。
内容的提问来源于stack exchange,提问作者541daw35d
相关产品推荐
相关产品推荐

