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

PHP登录后跳转首页并显示用户名,规避未登录Undefined index报错

解决未登录访问首页的Notice错误 & 登录后显示用户名

嘿,我来帮你搞定这个问题!核心问题就是未登录时$_SESSION['username']还没被设置,直接调用就会触发PHP的Undefined index提示。我们分两步解决:先修复首页的提示问题,再完善登录逻辑确保会话变量正确设置。


1. 修复index.php的Notice问题

你的index.php里直接输出$_SESSION['username'],但未登录时这个变量根本不存在,所以得先检查它是否存在再输出。修改后的代码如下:

<?php
session_start(); // 这个必须放在最顶部,任何输出(包括空格、换行)之前都不能有内容!
?>

<!DOCTYPE html>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <?php
    // 先判断会话里有没有用户名
    if (isset($_SESSION['username'])) {
        echo "欢迎回来," . $_SESSION['username'] . "!";
    } else {
        // 未登录的话就引导去登录
        echo "你还没登录呢,请<a href='login.php'>点击登录</a>";
    }
    ?>
</body>
</html>

关键点提醒:

  • session_start()一定要放在脚本最开头,哪怕前面多一个空格都会导致会话启动失败,这点特别容易踩坑!
  • 用isset($_SESSION['username'])来判断变量是否存在,完美避开Undefined index的Notice。

2. 完善login.php的登录逻辑

从你给的代码片段来看,还需要确保登录成功后正确设置会话变量,然后跳转到首页。我帮你补全并优化了代码:

<?php
session_start();
$conn = mysqli_connect("localhost", "root", "", "articleZone");
$message = "";

// 先检查数据库连没连上,别上来就查数据
if (!$conn) {
    die("数据库连接崩了:" . mysqli_connect_error());
}

if (!empty($_POST["login"])) {
    // 这里必须做SQL注入防护!不然很容易被黑
    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);

    $result = mysqli_query($conn, "SELECT * FROM users WHERE username = '$username'");
    $user = mysqli_fetch_assoc($result);

    if ($user) {
        // 划重点:如果你的密码是加密存储的,一定要用password_verify!别直接比字符串
        // 比如:if (password_verify($password, $user['password'])) {
        if ($user['password'] === $password) { // 这里不推荐明文存密码,赶紧改成加密的!
            // 登录成功,把用户名存到会话里
            $_SESSION['username'] = $user['username'];
            // 跳转到首页,跳转后一定要exit,不然后面的代码还会执行
            header("Location: index.php");
            exit;
        } else {
            $message = "用户名或密码不对哦";
        }
    } else {
        $message = "这个用户不存在呀";
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <form method="post">
        <input type="text" name="username" placeholder="请输入用户名" required>
        <input type="password" name="password" placeholder="请输入密码" required>
        <button type="submit" name="login">登录</button>
        <?php if (!empty($message)) : ?>
            <p style="color: red;"><?php echo $message; ?></p>
        <?php endif; ?>
    </form>
</body>
</html>

重要优化点:

  • 防SQL注入:用mysqli_real_escape_string处理用户输入,或者更安全的预处理语句,别让恶意代码有机可乘。
  • 密码安全:绝对绝对不要明文存密码!注册用户时用password_hash()加密,登录时用password_verify()验证,这是基本的安全要求。
  • 跳转后终止脚本:header("Location: ...")之后必须加exit;,不然脚本会继续往下跑,可能出现奇怪的问题。

额外加个退出登录功能(可选)

要是需要退出登录的话,在index.php里加这段代码就行:

<?php
// 处理退出登录
if (isset($_GET['logout'])) {
    session_destroy(); // 销毁整个会话
    header("Location: login.php");
    exit;
}
?>

<!-- 在首页显示退出链接 -->
<?php if (isset($_SESSION['username'])) : ?>
    <p><a href="index.php?logout=1">退出登录</a></p>
<?php endif; ?>

这样用户就能正常退出,回到登录页面啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:31:29