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

如何解决页面刷新时PHP SESSION失效导致用户被登出的问题

问题修复方案

核心问题1:首页未开启session会话

所有需要读取/操作$_SESSION变量的页面,必须在PHP代码最顶部执行session_start(),你的首页index.php漏了这行代码,导致页面加载时无法读取已存储的session数据,看起来就像被登出了。
修复方式:在首页index.php的PHP代码块第一行添加session_start():

<?php
session_start(); // 新增这行,必须放在所有页面输出之前
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
include "../app/model/loadImages.php";
include "../app/core/config.php";
include "../app/model/login.php";
?>

核心问题2:退出逻辑错误导致session被提前清空

你把PHP的session_unset()写在了JS函数EndSession()里,PHP是服务端执行代码,页面加载时这行代码就会直接运行,不管用户有没有点击退出按钮,只要页面加载完成session就被清空,刷新自然就会登出。
修复方式:

  1. 删掉首页里的整个EndSession()JS函数代码
  2. 新建独立的logout.php处理退出逻辑,代码如下:
<?php
session_start();
// 清空session数据并销毁会话
session_unset();
session_destroy();
// 跳转回登录页
header("Location: /MyProject/public/login/index.php");
exit;
?>
  1. 修改首页的退出按钮链接,指向新建的logout.php:
// 原来的echo "<a href='' action='EndSession();'>Logout</a>"; 替换为下面的代码
echo "<a href='/MyProject/public/logout.php'>Logout</a>";

可选优化:修正管理员权限判断逻辑

你当前的$_SESSION['is_admin']直接存储了mysqli_query返回的结果对象,不仅无法正常判断权限,还可能导致session序列化异常。可以在登录校验时直接从用户查询结果中取管理员标识:

// 修改login.php里的CheckUser方法对应代码
if ($count == 1) {
    $user = mysqli_fetch_assoc($log_result); // 取出当前登录用户的全量信息
    $_SESSION['loggedin'] = true;
    $_SESSION['username'] = $username;
    $_SESSION['is_admin'] = $user['is_admin']; // 假设signup表有is_admin字段存储管理员标识
    header("Location: ../home/index");
    exit; // 新增exit防止后续代码意外执行
}

额外建议:密码不要明文存储到数据库,用户注册时用password_hash()加密密码,登录校验时用password_verify()匹配,避免数据泄露导致账号安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:36:04