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
相关产品推荐
相关产品推荐

