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

如何通过AJAX向PHP发送并接收多个日期数据

解决AJAX传递不定数量日期数组到PHP的问题

我帮你梳理下现有代码里的问题,再给出完整的修正方案:

你的代码里的核心问题

  1. 数组声明错误:var DAT = {}创建的是JS对象,不是数组,要存多个日期得用var DATE = []这种数组语法
  2. 参数传递方式不对:直接把数组拼到POST参数里,JS会把数组转成[object Array]字符串,PHP根本没法解析成数组
  3. AJAX顺序问题:你把open和send写在了onreadystatechange的回调里,这会导致每次状态变化都重新发请求,逻辑完全错了

修正后的JavaScript代码

// 正确声明数组,用来存有效日期
var DATE = [];
let k = 0;
for(let x = 1; x <= 12; x++) {
    const I = "#ED" + x;      
    const d = $(I).children('.dd').val();
    const m = $(I).children('.mmm').val();
    const y = $(I).children('.yyyy').val();
    const c = date_chk(d, m, y); // 返回1表示日期有效
    
    if(c === 1) {
        DATE[k] = [d, m, y];
        k++;
    }
}

// 初始化AJAX对象(如果用jQuery的$.ajax会更简洁,这里保留你的原生写法)
const AJ = new XMLHttpRequest();
AJ.onreadystatechange = function() {
    if(AJ.readyState === 4 && AJ.status === 200) {
        const PH_RP = AJ.responseText; 
        const DATE_Lst = JSON.parse(PH_RP);       
        // 遍历返回的所有日期,不管数量多少都能处理
        DATE_Lst.DT.forEach((date, index) => {
            alert(`DATE${index+1} Day::${date[0]} Month::${date[1]} Year::${date[2]}`);
        });
    }   
};

// 把数组转成JSON字符串,再编码后传递,PHP能直接解析
const para = `DATESS=${encodeURIComponent(JSON.stringify(DATE))}`;
AJ.open("POST", "PHP/4_PHP_Check_Dates.php", true);
AJ.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
AJ.send(para);

这段JS的关键调整

  • 用[]正确声明数组,存每个有效日期的[日,月,年]子数组
  • 用JSON.stringify把数组转成JSON字符串,再用encodeURIComponent编码,避免特殊字符乱码
  • 调整AJAX代码顺序:先绑定状态回调,再打开连接发送请求,确保能监听到返回结果
  • 返回后用forEach遍历数组,不管返回多少个日期都能处理,不用硬写固定索引

修正后的PHP代码

<?php
// 获取POST过来的JSON字符串,解析成PHP数组
$datesJson = $_POST['DATESS'];
$datesArray = json_decode($datesJson, true);

// 遍历所有日期,做有效性检查(这里用PHP内置的checkdate,你也可以替换成自己的验证逻辑)
$validDates = [];
foreach($datesArray as $date) {
    list($d, $m, $y) = $date;
    // checkdate(月, 日, 年),返回true表示日期有效
    if(checkdate((int)$m, (int)$d, (int)$y)) {
        $validDates[] = $date;
    }
}

// 把处理后的日期数组转成JSON返回给JS
$response = ['DT' => $validDates];
echo json_encode($response);
?>

PHP代码说明

  • 用json_decode($datesJson, true)把JSON字符串转成PHP的索引数组,直接通过$datesArray[0]、$datesArray[1]访问单个日期
  • 用checkdate做日期有效性验证,比自己写逻辑更可靠,当然你可以替换成自己的date_chk逻辑
  • 最终把有效日期数组放进$response['DT'],转成JSON返回,JS那边就能直接遍历

备选方案:不用JSON,直接传表单数组

如果你不想用JSON,也可以用表单数组的格式传递,JS代码改成:

let para = "";
DATE.forEach((date) => {
    // 把每个日期的日、月、年用逗号拼接,然后以DATESS[]的形式传递
    para += `DATESS[]=${encodeURIComponent(date.join(','))}&`;
});
// 去掉最后多余的&符号
para = para.slice(0, -1);

AJ.open("POST", "PHP/4_PHP_Check_Dates.php", true);
AJ.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
AJ.send(para);

对应的PHP代码可以直接读取数组:

<?php
// 直接获取POST过来的数组
$datesArray = $_POST['DATESS'];
$validDates = [];
foreach($datesArray as $dateStr) {
    // 把字符串拆成日、月、年
    list($d, $m, $y) = explode(',', $dateStr);
    if(checkdate((int)$m, (int)$d, (int)$y)) {
        $validDates[] = [$d, $m, $y];
    }
}
echo json_encode(['DT' => $validDates]);
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:50:26