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

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>

关键改动说明

  1. 提前启动Session:session_start()必须放在所有输出之前,用来暂存需要跨请求传递的提示信息。
  2. POST阶段无输出:移除了POST处理里的echo,确保整个POST处理流程没有任何内容输出,让header()能正常发送重定向指令。
  3. 用Session传递数据:重定向后,新的GET请求从Session中取出之前存储的提示信息,显示给用户后立即销毁该Session变量,避免重复显示。
  4. 安全优化:用htmlspecialchars()处理用户输入的城市名称,防止XSS攻击,这是处理用户输入的标准操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:23:35