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);
额外提醒
- 之前你用
json_decode得到null,很大概率是因为直接把JavaScript数组传给了PHP——PHP的json_decode只能处理JSON格式的字符串,不能处理数组类型的POST参数。 - 尽量通过表单元素的
name属性筛选目标复选框(比如$('input[name="DayChosen[]"]:checked')),比用class更准确,避免其他复选框干扰。
内容的提问来源于stack exchange,提问作者Brian Nowlan
相关产品推荐
相关产品推荐

