如何通过AJAX向PHP发送并接收多个日期数据
解决AJAX传递不定数量日期数组到PHP的问题
我帮你梳理下现有代码里的问题,再给出完整的修正方案:
你的代码里的核心问题
- 数组声明错误:
var DAT = {}创建的是JS对象,不是数组,要存多个日期得用var DATE = []这种数组语法 - 参数传递方式不对:直接把数组拼到POST参数里,JS会把数组转成
[object Array]字符串,PHP根本没法解析成数组 - 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
相关产品推荐
相关产品推荐

