PHP会话存储手机号异常:跳转页面后Session为空的问题求助
问题:跳转后Session丢失,无法获取手机号
我是PHP新手,正在学习Session的使用,现有api.php、index.php和updatePassword.php三个文件,想实现基于手机号的密码更新练习功能。需求是:从index.php把手机号发送到api.php,验证密码为“Gasolina123”时跳转至密码更新页面,但跳转后Session为空,不知道哪里出问题了。
index.php 中的JavaScript代码
<script> function submitForm() { // 获取表单数据 var formData = new FormData(document.getElementById("login-form")); var phoneNumber = document.getElementsByName("phone")[0].value; var passwordFromUser = formData.get("passwordFromUser"); // 获取密码 // 发送AJAX请求到api.php,action设为'login' var xhr = new XMLHttpRequest(); xhr.open("POST", "api.php", true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { // 处理响应 var response = JSON.parse(xhr.responseText); alert(xhr.responseText); sessionStorage.setItem('phone', phoneNumber); if (response.status === "update_password") { // 跳转到密码更新页面 window.location.href = "update-password.php"; } else if (response.status === "ok") { // 跳转到首页 window.location.href = "homePage.php"; } else if (response.error) { // 显示返回的错误信息 alert("错误: " + response.error); } else { // 意外响应,显示通用错误 alert("错误 - 意外响应"); alert(xhr.responseText); } } else { // 请求失败时显示错误 alert("错误: 无法处理请求。状态码: " + xhr.status); } } }; // 添加'action'参数为'login' formData.append("action", "login"); // 发送表单数据 xhr.send(formData); } </script>
api.php 代码
<?php session_start(); // 启动Session // 引入Database类 include_once 'Database.php'; header('Content-Type: text/html; charset=UTF-8'); // 创建Database对象 $db = new Database(); // 检查表单中是否存在手机号 if(isset($_POST['phone'])) { $_SESSION['phone'] = htmlspecialchars($_POST['phone']); // 将手机号存入Session } // 检查表单中是否存在phoneNumber参数 if(isset($_POST['phoneNumber'])) { $_SESSION['phone'] = htmlspecialchars($_POST['phoneNumber']); // 将手机号存入Session } // 检查是否指定了action if(isset($_POST['action'])) { $action = $_POST['action']; switch($action) { case 'login': // 处理登录操作 if(isset($_POST['phone']) && isset($_POST['passwordFromUser'])) { $phone = $_POST['phone']; $password = md5(md5($_POST['passwordFromUser'])); // 密码哈希 // 检查手机号是否存在于数据库 if ($db->phoneExists($phone)) { // 从数据库获取哈希后的密码 $stored_password = $db->getPassword($phone); // 验证输入密码与存储的哈希密码是否匹配 if ($password == $stored_password) { // 密码正确 // 检查是否需要更新密码 $stored_password_hash = md5(md5('Gasolina123')); if ($password == $stored_password_hash) { // 需要更新密码 echo json_encode(['status' => 'update_password']); } else { // 登录成功 echo json_encode(['status' => 'ok']); } } else { // 密码错误 echo json_encode(['error'=> '密码不正确']); } } else { // 手机号未在数据库中找到 echo json_encode(['error'=> '手机号未在数据库中']); } } else { // 缺少手机号或密码参数 echo json_encode(['error' => '缺少参数']); } break;
updatePassword.php 代码
<?php session_start(); // 启动Session print_r($_SESSION); if(isset($_SESSION['phone'])) { //echo "手机号已设置: ".$_SESSION['phone']; $phone = htmlspecialchars($_SESSION['phone']); // 从Session获取手机号 } else { echo "Session中未设置手机号"; // 如果Session中没有手机号,跳转到登录页 header("Location: index.php"); exit; // 停止脚本执行 } ?>
问题原因与解决方法
核心问题:Session Cookie传递异常
AJAX请求api.php时服务器设置了Session,但跳转至updatePassword.php时,浏览器未正确携带Session Cookie,导致新请求无法识别原有Session。结合代码细节,具体修复点如下:
修正api.php的响应头
你返回的是JSON数据,但设置了text/html的Content-Type,这会干扰浏览器对Cookie的处理。将api.php中的响应头改为:header('Content-Type: application/json; charset=UTF-8');确保AJAX请求携带Cookie
在XMLHttpRequest中添加withCredentials配置,强制请求携带当前域名的Cookie:var xhr = new XMLHttpRequest(); xhr.open("POST", "api.php", true); xhr.withCredentials = true; // 新增此行检查Session启动时机
确认所有用到Session的PHP文件(api.php、updatePassword.php)中,session_start();是第一行可执行代码,前面不能有任何输出(包括空格、换行、BOM头)。验证Session存储权限
检查php.ini中session.save_path指向的目录是否有服务器进程的写入权限,权限不足会导致Session无法持久化存储。
内容的提问来源于stack exchange,提问作者Barak Rosenfeld
相关产品推荐
相关产品推荐

