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

JavaScript数组通过Ajax提交至PHP文件丢失问题求助

问题分析与解决方案

你的核心问题在于Ajax请求和后续的window.open是两个完全独立的HTTP请求——Ajax确实把数据传给了PHP,但新窗口打开的页面根本没携带这些数据,所以PHP自然拿不到;之前JSON解码返回null,大概率是因为PHP没收到正确的参数(或是你直接传递了数组,没转成JSON字符串)。另外,你现在把事件绑定在了下拉框的change事件上,逻辑也不对,应该是点击「Register」按钮时才处理提交。

下面给你两种可靠的解决方案,优先推荐第一种:


方案一:用临时表单在新窗口提交数据

这种方式最直接,不需要依赖Ajax,直接构建一个隐藏表单,在新窗口提交所有选中的数据,PHP端可以直接获取数组,不需要额外编码解码。

修改后的JavaScript代码

$('#Register').on('click', function(e) {
    // 阻止表单默认的提交行为
    e.preventDefault();
    
    // 收集选中的复选框值(通过name属性筛选更准确)
    const selectedDays = $('input[name="DayChosen[]"]:checked').map(function() {
        return $(this).val();
    }).get();
    
    // 获取选中的学生数量
    const studentCount = $('.Register-Multiple').val();
    
    // 简单校验
    if (!selectedDays.length || !studentCount) {
        alert('请先选择课程天数和学生数量哦');
        return;
    }
    
    // 创建临时隐藏表单
    const tempForm = $('<form>', {
        method: 'POST',
        action: '../../wp-content/themes/traffica/Multiple-registration.php',
        target: '_blank' // 指定在新窗口打开
    });
    
    // 把选中的课程添加为隐藏字段(保持name="DayChosen[]",PHP会自动解析成数组)
    selectedDays.forEach(day => {
        tempForm.append($('<input>', {
            type: 'hidden',
            name: 'DayChosen[]',
            value: day
        }));
    });
    
    // 添加学生数量字段
    tempForm.append($('<input>', {
        type: 'hidden',
        name: 'studentCount',
        value: studentCount
    }));
    
    // 提交表单后移除
    tempForm.appendTo('body').submit().remove();
});

PHP端接收代码

直接用$_POST就能拿到数组,不需要额外处理:

// 接收选中的课程数组
$selectedDays = $_POST['DayChosen'] ?? [];
// 接收学生数量
$studentCount = $_POST['studentCount'] ?? 0;

var_dump($selectedDays); // 现在就能看到正确的数组了

方案二:Ajax存Session,新页面读取Session

如果一定要保留Ajax的逻辑,可以把数据存在Session里,然后新页面从Session中读取。这种方式适合需要先做后端处理再跳转的场景,但要注意Session的生命周期问题。

JavaScript代码

$('#Register').on('click', function(e) {
    e.preventDefault();
    
    const selectedDays = $('input[name="DayChosen[]"]:checked').map(function() {
        return $(this).val();
    }).get();
    
    const studentCount = $('.Register-Multiple').val();
    
    if (!selectedDays.length || !studentCount) {
        alert('请先选择课程天数和学生数量哦');
        return;
    }
    
    $.ajax({
        type: "POST",
        url: '../../wp-content/themes/traffica/Multiple-registration.php',
        data: {
            // 把数组转成JSON字符串再传递
            courses: JSON.stringify(selectedDays),
            studentCount: studentCount,
            // 标记这是存储Session的请求
            saveToSession: true
        },
        success: function() {
            // 存储成功后打开新页面
            window.open('../../wp-content/themes/traffica/Multiple-registration.php');
        }
    });
});

PHP端代码

session_start();

// 处理Ajax的Session存储请求
if (isset($_POST['saveToSession'])) {
    // 解码JSON字符串成数组
    $_SESSION['selectedCourses'] = json_decode($_POST['courses'], true);
    $_SESSION['studentCount'] = $_POST['studentCount'];
    exit; // 处理完直接退出,避免输出无关内容
}

// 新页面读取Session中的数据
$selectedDays = $_SESSION['selectedCourses'] ?? [];
$studentCount = $_SESSION['studentCount'] ?? 0;

// 用完销毁Session数据,避免后续请求干扰
unset($_SESSION['selectedCourses'], $_SESSION['studentCount']);

var_dump($selectedDays);

额外提醒

  1. 之前你用json_decode得到null,很大概率是因为直接把JavaScript数组传给了PHP——PHP的json_decode只能处理JSON格式的字符串,不能处理数组类型的POST参数。
  2. 尽量通过表单元素的name属性筛选目标复选框(比如$('input[name="DayChosen[]"]:checked')),比用class更准确,避免其他复选框干扰。

内容的提问来源于stack exchange,提问作者Brian Nowlan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:23:16