已登录但Logout按钮不显示的问题排查请求(附PHP代码)
嘿,我看了你遇到的问题——登录成功后index.php里的Logout按钮没显示出来,虽然URL已经显示login=success了。作为PHP新手踩这种session相关的坑太正常了,咱们一步步来排查和解决:
首先,先理清核心问题逻辑
你登录成功后跳转到的是home.php?login=success,但你提到的是index.php的Logout按钮不显示。所以首先要确认:你是从home.php返回index.php时看不到按钮?还是直接访问index.php时(登录状态下)看不到?不管哪种情况,核心都是session没有被正确读取。
一步步排查问题
1. 确认header.php的session_start()是否真的生效
你说已经在header.php第一行加了session_start();,但要注意:这个语句必须在任何输出(包括空格、HTML标签、echo内容)之前执行。哪怕header.php里session_start()前面有一个空格,都会导致session启动失败(因为PHP发送HTTP头的规则限制)。
可以打开header.php检查:
- 第一行是不是绝对的
<?php session_start(); ?>,前面没有任何字符(包括空行、空格) - 如果
header.php里有HTML代码,必须放在session_start()之后
2. 检查session是否真的被设置成功
在login.inc.php里,设置完session的代码块后,加一行调试代码,看看session有没有被正确写入:
// 登录成功设置session之后添加 var_dump($_SESSION); exit();
登录成功后,页面会打印出session的内容,你可以确认key字段是否存在。如果这里能看到$_SESSION['key']的值,说明session设置没问题;如果看不到,那就是设置环节出了问题。
3. 检查index.php能否读取到session
在index.php的最开头(include完header.php之后),也加一行调试代码:
<?php include_once 'header.php'; ?> <?php var_dump($_SESSION); // 加这行调试 ?> <body> <!-- 剩下的代码不变 -->
访问index.php时,看看输出的session里有没有key字段。如果没有,说明session没有在页面之间传递,大概率是浏览器禁用了cookie(PHP默认用cookie存储session ID),或者header.php的session_start()没生效。
4. 修复login.inc.php的语法问题
看你提供的login.inc.php代码,最后有一个多余的大括号,导致代码逻辑可能异常。把代码格式化后,正确的括号配对应该是这样:
<?php session_start(); if (isset($_POST['submitLogin'])) { include_once 'dbh.inc.php'; $EmailUsername = $_POST['EmailUsername']; $password = $_POST['password']; if (empty($EmailUsername)) { header("Location: ../index.php?login=empty1"); exit(); } else { if (empty($password)) { header("Location: ../index.php?login=empty2"); exit(); } else { $sql = "SELECT * FROM users WHERE user_email='$EmailUsername' || user_username='$EmailUsername'"; $result = mysqli_query($conn, $sql); $resultCheck = mysqli_num_rows($result); if ($resultCheck < 1) { header("Location: ../index.php?login=error"); exit(); } else { if($row = mysqli_fetch_assoc($result)){ $hashedPwdCheck = password_verify($password, $row['user_password']); if ($hashedPwdCheck == false) { header("Location: ../index.php?login=error"); exit(); } elseif ($hashedPwdCheck == true) { $_SESSION['key'] = $row['user_id']; $_SESSION['first'] = $row['user_first']; $_SESSION['last'] = $row['user_last']; $_SESSION['email'] = $row['user_email']; $_SESSION['username'] = $row['user_username']; header("Location: ../home.php?login=success"); exit(); } } } } } } else { header("Location: ../index.php?login=error"); }
多余的括号可能会导致PHP解析错误,虽然不一定会报错,但会影响逻辑执行。
5. 检查浏览器的cookie设置
PHP的session默认依赖cookie来存储session ID,如果浏览器禁用了cookie,session就无法在页面之间传递。你可以:
- 打开浏览器开发者工具(F12)
- 切换到「Application」(Chrome)或「Storage」(Firefox)标签
- 查看「Cookies」下有没有名为
PHPSESSID的cookie,如果没有,说明浏览器禁用了cookie,或者session启动失败。
额外提醒:SQL注入风险
你现在的SQL查询是直接把用户输入拼接到语句里的,比如:
$sql = "SELECT * FROM users WHERE user_email='$EmailUsername' || user_username='$EmailUsername'";
这有严重的SQL注入风险!以后一定要用预处理语句(Prepared Statements)来处理数据库查询,比如用mysqli_prepare()和mysqli_stmt_bind_param(),这个是新手必须要掌握的安全技能。
内容的提问来源于stack exchange,提问作者Satellite Sage

