如何解决页面刷新时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就被清空,刷新自然就会登出。
修复方式:
- 删掉首页里的整个
EndSession()JS函数代码 - 新建独立的
logout.php处理退出逻辑,代码如下:
<?php session_start(); // 清空session数据并销毁会话 session_unset(); session_destroy(); // 跳转回登录页 header("Location: /MyProject/public/login/index.php"); exit; ?>
- 修改首页的退出按钮链接,指向新建的
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
相关产品推荐
相关产品推荐

