Post-Redirect-Get(PHP)代码故障咨询:简单PHP代码问题排查
我来帮你搞定这个PRG模式的问题~你的代码现在有两个核心问题导致故障,咱们一步步拆解解决:
先说说原代码的问题
- Headers Already Sent 错误:你在执行
header('Location: ...')之前,已经输出了HTML表单和echo "The typed city is: ".$city;的内容。HTTP协议要求响应头必须在任何实际内容(HTML、文本等)之前发送,所以这会直接导致PHP报错,重定向根本不会生效。 - 重定向后数据丢失:就算重定向成功了,POST请求的
$city数据在新的GET请求里也不存在了,用户看不到之前输入的城市信息,这违背了PRG模式的初衷——既要避免表单重复提交,又要给用户反馈。
修正后的完整代码
<?php // 启动session,用来暂存重定向后的提示信息(必须在任何输出之前调用) session_start(); if(isset($_POST['submit'])) { // 处理POST请求:获取并过滤用户输入 $city = htmlspecialchars($_POST['city']); // 将提示信息存入session,这样重定向后还能获取到 $_SESSION['city_message'] = "The typed city is: " . $city; // 重定向到当前页面(触发GET请求),用PHP_SELF避免URI里的额外参数干扰 header('Location: ' . htmlentities($_SERVER['PHP_SELF'])); exit(); // 必须exit,确保后续代码不会继续执行 } // 处理GET请求:从session取出提示信息(如果有的话) $message = ''; if(isset($_SESSION['city_message'])) { $message = $_SESSION['city_message']; // 用完消息后立即销毁,避免用户刷新页面重复显示相同内容 unset($_SESSION['city_message']); } ?> <html> <head> </head> <body> <form name="test" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post"> City name: <input type="text" name="city"><br> <input type="submit" name="submit" value="Search"><br> </form> <?php // 在GET请求流程里显示提示信息 if(!empty($message)) { echo $message; } ?> </body> </html>
关键改动说明
- 提前启动Session:
session_start()必须放在所有输出之前,用来暂存需要跨请求传递的提示信息。 - POST阶段无输出:移除了POST处理里的
echo,确保整个POST处理流程没有任何内容输出,让header()能正常发送重定向指令。 - 用Session传递数据:重定向后,新的GET请求从Session中取出之前存储的提示信息,显示给用户后立即销毁该Session变量,避免重复显示。
- 安全优化:用
htmlspecialchars()处理用户输入的城市名称,防止XSS攻击,这是处理用户输入的标准操作。
内容的提问来源于stack exchange,提问作者Cesare
相关产品推荐
相关产品推荐

