AJAX请求报错Undefined index,POST参数id、dt未定义如何解决?
问题解决方法
1 问题根因
- PHP端的判断条件
isset($_REQUEST)永远返回true,哪怕请求没有携带任何参数,只要请求发起就会通过校验,直接进入参数获取逻辑,所以只要收到请求不管有没有传id、dt都会触发未定义索引报错 setInterval的首次执行会延迟2秒才触发,如果页面刚加载时就有其他逻辑主动请求了refreshState.php,或者直接在浏览器地址栏访问了这个PHP文件,都会没有携带POST参数直接触发报错- 如果前端页面中id为
id和dt的DOM元素不存在,val()会返回undefined,AJAX传递参数时会自动丢弃值为undefined的字段,也会导致后端收不到参数 - 隐藏问题:
date_create返回的是DateTime对象,不能直接作为字符串绑定到SQL预处理语句中,会导致后续更新数据异常
2 后端修复方案
修改PHP代码,增加参数存在性校验,同时修复DateTime对象转字符串的问题:
<?php session_start(); // 限定POST请求,且两个必填参数都存在才执行逻辑 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['dt'], $_POST['id'])) { require_once("./dbConfig.php"); // 处理dt参数,转成数据库支持的标准时间字符串格式 $dt = trim($_POST["dt"], "'"); $dateObj = date_create($dt); // 日期格式非法时用当前时间兜底 $now = $dateObj ? $dateObj->format('Y-m-d H:i:s') : date('Y-m-d H:i:s'); $id = $_POST["id"]; $update_login = "UPDATE users set login_time=? where id=?"; $update_login = $db->prepare($update_login); $update_login->bind_param("ss", $now, $id); $update_login->execute(); } ?>
3 前端修复方案
修改JS代码,避免无参数的无效请求发起,同时调整请求触发时机:
<script> $(document).ready(function() { // 封装请求逻辑 function refreshState() { var val1 = $("#id").val(); var val2 = $("#dt").val(); // 两个参数都有值再发起请求 if (val1 && val2) { $.ajax({ url: "refreshState.php", type: "POST", data: { id: val1 , dt: val2 } }); } } // 页面加载完成立即执行一次,无需等待2秒延迟 refreshState(); // 后续每隔2秒刷新一次 setInterval(refreshState, 2000); }); </script>
注:如果
id、dt对应的DOM不是输入类元素(input/select等),需要把.val()替换为.text()获取元素内容。
内容的提问来源于stack exchange,提问作者Muhammed RYHAN
相关产品推荐
相关产品推荐

