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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:15:49