PHP会话数据无法跨页面传递问题排查(已开启session.autostart)
问题原因及解决办法
1. 移除重复的session_start()调用
你已经在php.ini中设置了session.autostart = 1,PHP会自动为每个请求初始化session,此时手动在connect.php中调用session_start()会触发冲突警告,干扰session正常工作。
修改connect.php,删除session_start();这一行:
<?php // 移除session_start(); $server_name = "localhost"; $user_name = "root"; $password = ""; $database_name = "table"; $connection = mysqli_connect($server_name, $user_name, $password,$database_name); // Checking the connection if (!$connection) { die("Failed ". mysqli_connect_error()); } ?>
2. 跳转后终止脚本执行
登录验证代码中,设置header("location: ...")后,必须立即调用exit()或die(),阻止后续代码继续执行,避免session被意外修改或脚本逻辑干扰session写入。
修改登录验证代码:
$username = mysqli_real_escape_string($connection, $_POST["email"]); $password = mysqli_real_escape_string($connection, $_POST["password"]); $query = "SELECT * FROM user WHERE email = '$username'"; $result = mysqli_query($connection, $query); if(mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_array($result)) { if(password_verify($password, $row["password"])) { $_SESSION["userId"] = $row["userId"]; header("location: http://localhost/dashboard/entry.php"); exit(); // 新增这一行,终止脚本 } else { echo '<script>alert("Wrong User Details - PASSWORD DOESNT MATCH")</script>'; } } } else { echo '<script>alert("Wrong User Details - NO EMAIL")</script>'; }
3. 检查XAMPP的session存储权限
全新安装的XAMPP可能存在session存储目录权限不足的问题,导致session文件无法持久化保存:
- 打开php.ini,找到
session.save_path配置,默认路径Windows为C:\xampp\tmp,Linux为/opt/lampp/tmp。 - 确保该目录存在且PHP进程拥有读写权限:
- Windows:右键目录→属性→安全,给IIS_IUSRS或当前用户添加读写权限。
- Linux:执行
chmod 777 /opt/lampp/tmp(仅用于测试,生产环境需设置更严格权限)。
4. 验证session状态
可以在entry.php中先打印全部session内容,辅助排查问题:
<?php include('connect.php'); var_dump($_SESSION); // 打印全部session内容,方便排查 if(!isset($_SESSION["userId"])) { echo "NO SESSION"; // header("location: http://localhost/dashboard/index.php"); } else { echo "WE HAVE A SESSION!!!"; } ?>
内容的提问来源于stack exchange,提问作者letsCode
相关产品推荐
相关产品推荐

