
本文介绍使用 PHP Session 实现表单提交后跳转刷新页面的同时,安全、可靠地显示错误或提示消息,避免重复提交,并解决因 header("Location: ...") 导致消息丢失的问题。
本文介绍使用 php session 实现表单提交后跳转刷新页面的同时,安全、可靠地显示错误或提示消息,避免重复提交,并解决因 `header("location: ...")` 导致消息丢失的问题。
在 Web 开发中,常见需求是:用户提交登录/注册等表单后,页面跳转回原页(如 index.php)并显示相应提示(如“用户名不能为空”或“登录失败”)。但若直接用 header("Location: index.php") 跳转,当前脚本中的局部变量(如 $error1)会丢失,导致消息无法显示——这正是你遇到的核心问题。
根本解法是将提示消息暂存于 Session,利用其跨请求生命周期的特性,在重定向后的目标页面中读取并立即销毁,确保消息仅显示一次(即 Flash Message 模式)。
✅ 正确实现步骤
开启 Session(已在代码顶部调用 session_start(),务必确保它出现在任何输出之前);
-
验证失败时,将错误信息写入 $_SESSION,而非本地变量:
if (empty($_POST['username'])) { $_SESSION['error'] = "Please enter username."; header("Location: index.php"); exit; // 防止后续代码执行,关键! } -
在目标页面(如 index.php)顶部检查并显示 Session 消息:
<?php if (isset($_SESSION['error'])): ?> <div class="alert alert-danger"><?php echo htmlspecialchars($_SESSION['error']); ?></div> <?php unset($_SESSION['error']); ?> <?php endif; ?>⚠️ 注意:unset() 必须紧跟在显示之后,否则刷新页面会重复显示;同时使用 htmlspecialchars() 防止 XSS 攻击。
-
补充安全与健壮性细节:
- 所有 header() 调用后必须加 exit 或 die,避免逻辑继续执行;
- 使用 $_POST['username'] 替代未定义的 $username(原代码中 $username 未初始化,存在 Notice 风险);
- SQL 查询应改用预处理语句防范注入(mysqli_real_escape_string 已过时且不彻底);
- 登录成功后设置 Session 前无需再次 session_start()(已启动);
- $id 变量未定义,应从查询结果中获取(如 mysqli_fetch_assoc($res))。
✨ 完整优化示例(关键片段)
<?php
session_start();
include("includes/config.php");
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit'])) {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if (empty($username)) {
$_SESSION['error'] = "Please enter username.";
header("Location: index.php");
exit;
}
// ✅ 推荐:使用预处理防止 SQL 注入
$stmt = $con->prepare("SELECT id, username FROM admin_user WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$user = $result->fetch_assoc();
$_SESSION['username'] = $user['username'];
$_SESSION['id'] = $user['id'];
$_SESSION['admin']['status'] = true;
header("Location: dashboard.php");
exit;
} else {
$_SESSION['error'] = "Invalid username or password.";
header("Location: index.php");
exit;
}
}
?>
<!-- 显示消息(放在表单上方) -->
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger">
<?php echo htmlspecialchars($_SESSION['error']); ?>
</div>
<?php unset($_SESSION['error']); ?>
<?php endif; ?>
<!-- 表单 HTML(保持不变) -->
<form method="post">
<!-- ... 输入字段与提交按钮 ... -->
</form>? 总结
- 不要依赖局部变量传递消息:重定向后作用域失效;
- Session 是同页提示的标准方案:轻量、可靠、符合 HTTP 语义;
- 始终 exit 在 header() 后:防止逻辑泄露与安全风险;
- 持续强化安全性:输入校验、输出转义、SQL 预处理缺一不可。
该模式不仅适用于登录,也广泛用于注册、评论、设置更新等所有需“提交 → 跳转 → 提示”的场景。

















