
本文讲解如何解决php表单提交后无法跨页面(如返回首页)持续访问用户登录数据的问题,重点介绍使用session存储认证状态的正确实践,并修复sql注入与逻辑缺陷。
本文讲解如何解决php表单提交后无法跨页面(如返回首页)持续访问用户登录数据的问题,重点介绍使用session存储认证状态的正确实践,并修复sql注入与逻辑缺陷。
在您的当前实现中,homepage.php 直接依赖 $_POST 数据——但该超全局变量仅在表单提交瞬间存在。当用户点击导航链接(如“Home”按钮)重新请求 homepage.php 时,请求方式变为 GET,$_POST 为空,导致未定义索引错误甚至数据库查询失败。这不是前端 Cookie 或 JavaScript 能根本解决的问题;核心在于服务端状态管理的设计缺失。
✅ 正确做法是:登录成功后,将关键用户信息存入 $_SESSION,并在所有受保护页面中通过 Session 读取和验证身份。
以下是重构后的完整方案:
1. 登录处理页(如 login_process.php)
<?php
session_start();
require 'dbconnect.php';
// 防止直接访问
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php');
exit;
}
$uname = trim($_POST['username'] ?? '');
$pword = $_POST['password'] ?? '';
// ✅ 使用预处理语句防止 SQL 注入(强烈推荐)
$stmt = $conn->prepare("SELECT id, username, email FROM tbl_users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $uname, $pword);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 1) {
$user = $result->fetch_assoc();
// ✅ 将必要信息存入 Session(避免存储密码!)
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['logged_in'] = true;
header('Location: homepage.php');
exit;
} else {
echo "<script>alert('登录失败:用户名或密码错误'); location.href='index.php';</script>";
}
?>2. homepage.php(安全读取 Session)
<?php
session_start();
// ? 强制登录校验
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
header('Location: index.php');
exit;
}
require 'dbconnect.php';
// ✅ 此处无需重复查库——用户身份已由 Session 保证
$username = htmlspecialchars($_SESSION['username']);
?>
<!DOCTYPE html>
<html>
<head><title>主页</title></head>
<body>
<nav>
<ul>
<li><a href="logout.php"><b>退出登录</b></a></li>
<li><a href="SlrSystem.html"><b>太阳系</b></a></li>
<li><a href="about-us.php"><b>关于我们</b></a></li>
<li><a href="homepage.php"><b>首页</b></a></li>
</ul>
</nav>
<div class="home">
<h1 class="right"><b>EXPLORE<br></b></h1>
<h1 class="left"><b>THE GALAXY FROM<br></b></h1>
<h1 class="right"><b>YOUR COUCH</b></h1>
</div>
</body>
</html>3. logout.php(安全注销)
<?php
session_start();
$_SESSION = []; // 清空全部 Session 数据
session_destroy(); // 销毁 Session 文件
setcookie(session_name(), '', time() - 3600, '/'); // 清除客户端 Session Cookie
header('Location: index.php');
exit;
?>⚠️ 重要注意事项:
- ❌ 切勿在 SQL 查询中拼接 $_POST 原始数据(您原代码存在严重 SQL 注入漏洞);
- ❌ 不要依赖 $_POST 跨页面传递业务数据——它不具备持久性;
- ✅ Session 是 PHP 官方推荐的服务器端状态管理机制,天然支持多页面共享;
- ✅ 所有敏感页面(如 homepage.php)必须前置 session_start() 和登录态校验;
- ✅ 生产环境应使用 password_hash()/password_verify() 替代明文密码存储。
通过以上改造,用户登录后无论点击多少次“Home”,只要 Session 有效,即可稳定访问主页并显示个性化内容——这才是健壮、安全、符合 Web 开发规范的解决方案。

















