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

PHP会话问题:else代码块不显示及登出功能失效求助

我来帮你一步步排查问题,你的代码里有几个关键逻辑错误,导致会话判断一直出错:

1. 主页面的Session初始化完全错误

你在主页面开头直接写了:

$_SESSION['username']=$username;
$_SESSION['password']=$password;
$_SESSION['is_log_in'] = true;

这里的$username和$password根本没有定义过!这会导致Session里的变量被设为null,还会触发PHP警告。更糟的是,你不管用户有没有登录,直接强制把is_log_in设为true——这相当于默认所有人都是登录状态,else块自然永远不会显示!

修正:删掉这三行代码!Session的赋值应该只在登录成功时处理(也就是你的登录脚本里),主页面只负责判断Session状态,不要随便初始化Session变量。

2. 主页面的登录判断逻辑混乱

你的if判断条件是:

if (isset($_SESSION['username'])&& isset($_SESSION['password'])==$password) {

这里有两个致命问题:

  • isset($_SESSION['password'])返回的是布尔值(true/false),你拿它和未定义的$password变量比较,结果永远不符合预期;
  • 永远不要把密码存在Session里,这是严重的安全问题!密码只需要在登录验证时使用,验证通过后不需要存到Session中。

修正:改用登录脚本里设置的$_SESSION['login']来判断:

if (isset($_SESSION['login']) && $_SESSION['login'] === true) {

3. 登录脚本的Session赋值错误

你的登录脚本验证成功后写了:

$_SESSION['username'] = $user;
$_SESSION['password'] = $pass;

但$user和$pass根本没有从POST请求中获取值!应该先添加:

$user = trim($_POST['user']);
$pass = trim($_POST['pass']);

不然Session里的username会是未定义的空值,主页面的判断自然会出错。

4. Logout.php的Session销毁不彻底

你只写了session_destroy();,但这个函数仅销毁服务器端的Session文件,当前请求中的$_SESSION数组还会保留。跳转后Session变量可能没被清空,导致主页面依然判断为登录状态。

修正:销毁前先清空Session数组,加上exit确保跳转后脚本停止执行:

<?php
session_start();
// 清空所有Session变量
$_SESSION = array();
// 销毁Session
session_destroy();
header("location: home.php");
exit;
?>

5. 其他小问题

  • 主页面的HTML结构有错误(比如出现无对应<table>的</table>标签),可能导致页面渲染异常,建议检查标签闭合;
  • 登录脚本的SQL语句存在注入风险,建议改用mysqli预处理语句,比如:
$sql = "SELECT password FROM user WHERE username = ?";
$stmt = mysqli_prepare($koneksi, $sql);
mysqli_stmt_bind_param($stmt, "s", $user);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

修正后的核心代码示例

登录脚本(rahasia.php)关键部分:

<?php
session_start();
include("DB/db.php");

if (isset($_GET['log']) && $_GET['log'] == 'out') {
    $_SESSION = array();
    session_destroy();
    header("location: home.php");
    exit;
}

$pesan = "";
if (isset($_POST['user']) && isset($_POST['pass'])) {
    $user = trim($_POST['user']);
    $pass = trim($_POST['pass']);
    
    // 预处理语句防注入
    $sql = "SELECT password FROM user WHERE username = ?";
    $stmt = mysqli_prepare($koneksi, $sql);
    mysqli_stmt_bind_param($stmt, "s", $user);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    
    if (mysqli_num_rows($result) > 0) {
        $row = mysqli_fetch_assoc($result);
        if ($row['password'] == md5($pass)) {
            $_SESSION['login'] = TRUE;
            $_SESSION['username'] = $user;
            // 登录成功跳转主页面
            header("location: home.php");
            exit;
        } else {
            $pesan = "用户名或密码不匹配";
        }
    } else {
        $pesan = "该用户未注册,请先注册";
    }
}
?>

主页面登录判断部分:

<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="css/css.css">
</head>
<body>
<div id="blank"></div>
<div id="panel">
    <nav id="bar">
        <div id="submen">
            <form id="sir">
                <input type="Search" name="search" placeholder="Search.." id="search">
            </form>
            <a href="wallpaper.php" id="menu">Walpaper</a>
            <a href="art.php" id="menu">Art</a>
            <a href="photo.php" id="menu">Photos</a>
            <a href="image.php" id="menu">Image</a>
            
            <?php if (isset($_SESSION['login']) && $_SESSION['login'] === true): ?>
                <span><?php echo htmlspecialchars($_SESSION['username']); ?></span>
                <a href="logout.php">log out</a>
            <?php else: ?>
                <a href="log_in.php" id="member">login</a>
                <a href="register.php" id="member">register</a>
            <?php endif; ?>
            
        </div>
    </nav>
</div>
</body>
</html>

这样调整后,应该就能正常切换登录/登出状态了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:46