PHP登录登出按钮状态切换功能实现求助
解决方案
1. 核心逻辑:判断用户登录状态
你的index.php已有登录状态判断逻辑,可直接复用控制按钮显示。确保所有需展示按钮的页面都引入controllerUserData.php(它负责启动Session),通过$_SESSION['email']是否存在结合用户验证状态,判断是否已登录。
2. 修改登录/登出按钮代码
替换你原有的按钮代码为以下带条件判断的版本:
<?php // 验证用户是否已登录(Session存在且账号已验证) $isLoggedIn = isset($_SESSION['email']) && isset($fetch_info['status']) && $fetch_info['status'] == 'verified'; ?> <?php if (!$isLoggedIn): ?> <!-- 未登录时显示登录按钮 --> <a href="/login-user.php" class="navbar-signin"> <span>Login</span> <ion-icon name="log-in-outline"></ion-icon> </a> <?php else: ?> <!-- 已登录时显示登出按钮及用户名 --> <a href="/logout-user.php" class="navbar-signin"> <span>Log out</span> <ion-icon name="log-out-outline"></ion-icon> <span><?php echo htmlspecialchars($fetch_info['name']); ?></span> </a> <?php endif; ?>
注:将登出按钮图标改为log-out-outline更符合语义,用htmlspecialchars()转义用户名可避免XSS攻击。
3. 补充logout-user.php文件
你缺少登出处理页面,创建logout-user.php并添加以下代码:
<?php session_start(); // 清空所有Session变量 $_SESSION = array(); // 销毁Session session_destroy(); // 跳转至登录页 header("Location: /login-user.php"); exit(); ?>
4. 修复原代码的SQL注入风险
你的SQL查询存在注入漏洞,需改用预处理语句。以index.php为例修改:
<?php require_once "controllerUserData.php"; ?> <?php if(isset($_SESSION['email'])){ $email = $_SESSION['email']; // 使用预处理语句执行查询 $sql = "SELECT * FROM usertable WHERE email = ?"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "s", $email); mysqli_stmt_execute($stmt); $run_Sql = mysqli_stmt_get_result($stmt); if($run_Sql){ $fetch_info = mysqli_fetch_assoc($run_Sql); $status = $fetch_info['status']; $code = $fetch_info['code']; if($status == "verified"){ if($code != 0){ header('Location: reset-code.php'); exit(); } }else{ header('Location: user-otp.php'); exit(); } } }else{ // 未登录时跳转至登录页 header('Location: login-user.php'); exit(); } ?>
同理,controllerUserData.php中的所有SQL查询都需改为预处理语句,彻底规避注入风险。
5. 优化Session存储逻辑
在controllerUserData.php的登录成功环节,仅存储必要的用户数据,不要存储密码:
// 登录成功时修改Session存储内容 $_SESSION['email'] = $email; $_SESSION['name'] = $fetch['name']; // 直接从数据库获取用户名,避免依赖临时变量
内容的提问来源于stack exchange,提问作者Ttemple
相关产品推荐
相关产品推荐

