XMLHttpRequest查询字符串正确但PHP提示Undefined array key错误
问题原因
你遇到的报错是两个传参逻辑错误共同导致的:
- 参数位置不匹配:你将
notification_action拼在了requestURL的查询串(?后面的部分),这部分属于GET参数,PHP的$_POST超全局只能读取POST请求体里的参数,完全拿不到URL里的查询参数。 - POST参数拼接错误:你往
parameters变量(也就是最终POST请求体的内容)追加notification_action时,只写了参数值,没有加参数名:
// 你的原错误写法 parameters += encodeURIComponent("mark_notification_as_read") + "&";
拼接后parameters的开头只有值mark_notification_as_read&,没有notification_action=前缀,所以POST请求体里根本不存在这个键,自然无法被$_POST读取。
而notification_id是从表单隐藏域里读取,拼接的时候带了参数名,放在POST请求体里,所以可以正常被$_POST接收。
解决方法
以下两种方案二选一即可:
方案1(推荐,符合POST请求规范):将所有参数放在POST请求体中
修改switch代码块中后两个分支的逻辑,删掉URL里的查询串,同时补全POST参数的键名:
case "mark_notification_as_read": requestURL = "../php/query_notifications.php"; parameters += "notification_action=" + encodeURIComponent("mark_notification_as_read") + "&"; getCurrentElementValue = true; break; case "delete_notification": requestURL = "../php/query_notifications.php"; parameters += "notification_action=" + encodeURIComponent("delete_notification") + "&"; getCurrentElementValue = true; break;
修改后PHP原有代码不需要改动,即可正常通过$_POST读取参数。
方案2:保留URL传参的写法,修改PHP读取参数的方式
如果要保留notification_action放在URL查询串的逻辑,PHP改用$_GET或者$_REQUEST读取即可:
// 方式1:读取URL里的GET参数 $action = $_GET["notification_action"]; // 方式2:$_REQUEST可以同时读取GET和POST的参数 // $action = $_REQUEST["notification_action"];
内容的提问来源于stack exchange,提问作者Zuno
相关产品推荐
相关产品推荐

