如何在PHP中检测表单是否通过AJAX提交
嘿,我来帮你解决这两个问题——先搞定你的核心痛点:为什么PHP里的isset($_POST['login-btn'])一直返回false,再聊怎么判断请求是JavaScript发起的。
一、先解决表单提交后$_POST检测失败的问题
你的问题根源出在AJAX请求的请求头和数据格式不匹配:
你手动设置了Content-Type: application/x-www-form-urlencoded,但发送的却是FormData对象。FormData默认会让浏览器自动设置正确的请求头(带boundary参数的multipart/form-data),你手动覆盖的请求头会导致PHP无法正确解析POST数据,所以$_POST数组是空的,自然isset($_POST['login-btn'])永远返回false。
修复方法:
直接删掉JS里的这一行:
ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
让浏览器自动处理请求头,这样PHP就能正确解析FormData里的所有字段,包括你的login-btn按钮参数。
二、如何检测请求是JavaScript(AJAX)发起的
有两种常用且可靠的方法:
方法1:添加自定义请求头
在你的AJAX请求代码里,添加一行自定义请求头(这是行业通用的AJAX标识):
function ajaxFormSubmit() { 'use strict'; let ajaxRequest = new XMLHttpRequest(); let url = 'admin login.php'; let formData = new FormData(loginForm); // 添加AJAX标识请求头 ajaxRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); // 其余onload、onerror、open逻辑不变... ajaxRequest.send(formData); }
然后在PHP里检测这个请求头:
// 判断是否为AJAX请求 $isAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'; // 结合表单提交判断 if($isAjax && isset($_POST['login-btn'])) { // 你的登录验证逻辑... }
方法2:在FormData里添加隐藏标识
如果担心某些环境会屏蔽自定义请求头,可以在FormData里手动添加一个标识字段:
function ajaxFormSubmit() { 'use strict'; let ajaxRequest = new XMLHttpRequest(); let url = 'admin login.php'; let formData = new FormData(loginForm); // 添加AJAX标识字段 formData.append('is_ajax', '1'); // 其余逻辑不变... ajaxRequest.send(formData); }
然后在PHP里检测这个字段:
if(isset($_POST['is_ajax']) && $_POST['is_ajax'] === '1' && isset($_POST['login-btn'])) { // 你的登录验证逻辑... }
额外小建议
你现在在PHP里输出<script>alert(...)</script>,在AJAX响应里不会自动执行——因为AJAX返回的是纯字符串,浏览器不会主动解析执行其中的JS。建议返回纯文本或JSON格式的结果,然后在前端的onload回调里处理,比如:
// 替换echo JS代码的逻辑 if($row != null) { // 验证成功返回成功信息 echo "登录成功"; } else { echo "用户名未注册"; }
前端直接用displayInfoMessage显示返回的文本即可,这样更符合AJAX的交互逻辑。
内容的提问来源于stack exchange,提问作者user7500403

