PHP登录状态留存问题:主页面获取SESSION['name']提示未定义
登录后主页面无法获取SESSION['name']的解决办法
你遇到的问题是登录后主页面调用$_SESSION['name']时提示未定义数组键,结合你提供的代码,以下是排查和解决思路:
问题代码回顾
登录处理代码:
if (password_verify($_POST['password'], $password)) { // 验证成功!用户已登录! // 创建会话,用于标记用户登录状态,会话类似Cookie但数据存储在服务器端 session_regenerate_id(); $_SESSION['loggedin'] = TRUE; $_SESSION['name'] = $_POST['username']; $_SESSION['id'] = $id; header('Location: mainpage.php'); }
主页面会话初始化代码:
<?php // 需要使用会话,因此必须先执行以下代码启动会话 session_start(); // 如果用户未登录则重定向到登录页 if (!isset($_SESSION['loggedin'])) { header('Location: index.php'); exit; } ?>
用户名显示代码:
<p>Welcome back, <?=$_SESSION['name']?>!</p>
错误提示:
Warning: Undefined array key "name" in C:\xampp\htdocs\refinery\mainpage.php on line 44
排查与解决步骤
检查登录表单的用户名输入框name属性:确保表单里用户名输入框的
name属性是username,如果写成user或其他值,$_POST['username']就会不存在,导致$_SESSION['name']没有被正确赋值。可以在登录处理代码开头增加校验:session_start(); // 先启动会话 if (!isset($_POST['username']) || trim($_POST['username']) === '') { header('Location: index.php?msg=请输入用户名'); exit; }确保登录处理页面启动了会话:登录处理的PHP文件必须在最开头调用
session_start();,而且要在任何输出(包括空格、HTML标签)之前。如果没启动会话,$_SESSION数组无法使用,赋值操作自然无效。调整session_regenerate_id的位置:把
session_regenerate_id();放到SESSION赋值之后,避免生成新会话ID时可能导致的旧数据丢失问题:$_SESSION['loggedin'] = TRUE; $_SESSION['name'] = $_POST['username']; $_SESSION['id'] = $id; session_regenerate_id(); // 赋值完成后再生成新会话ID header('Location: mainpage.php');补全主页面的会话数据校验:在主页面除了检查
loggedin,还要校验name是否存在,避免异常情况:session_start(); if (!isset($_SESSION['loggedin']) || !isset($_SESSION['name']) || empty($_SESSION['name'])) { header('Location: index.php'); exit; }
内容的提问来源于stack exchange,提问作者llamafarmingguru
相关产品推荐
相关产品推荐

