You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。结合代码细节,具体修复点如下:

  1. 修正api.php的响应头
    你返回的是JSON数据,但设置了text/html的Content-Type,这会干扰浏览器对Cookie的处理。将api.php中的响应头改为:

    header('Content-Type: application/json; charset=UTF-8');
    
  2. 确保AJAX请求携带Cookie
    在XMLHttpRequest中添加withCredentials配置,强制请求携带当前域名的Cookie:

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "api.php", true);
    xhr.withCredentials = true; // 新增此行
    
  3. 检查Session启动时机
    确认所有用到Session的PHP文件(api.php、updatePassword.php)中,session_start();是第一行可执行代码,前面不能有任何输出(包括空格、换行、BOM头)。

  4. 验证Session存储权限
    检查php.ini中session.save_path指向的目录是否有服务器进程的写入权限,权限不足会导致Session无法持久化存储。


内容的提问来源于stack exchange,提问作者Barak Rosenfeld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:05:13