使用AJAX在PHP文件间传POST参数时$_POST为空求助
看起来你遇到的核心问题是AJAX异步请求逻辑和页面跳转冲突,导致POST数据没被正确接收,同时代码里还有几个细节错误。咱们一步步拆解:
核心矛盾:AJAX请求与页面跳转是两个独立操作
你在发起AJAX POST请求后,立刻修改了链接的href并触发页面跳转——但这个跳转是一个全新的GET请求,和你刚才发起的AJAX POST完全没关系!所以当你跳转到testPHP.php时,看到的是这个GET请求的结果,自然$_POST是空的,而之前的AJAX POST请求的响应根本没机会在当前页面处理。
代码里的具体错误
1. test.php中的DOM操作错误
你写的document.getElementById('#link')是错误的,getElementById的参数不需要加#,直接写ID名link就行。更关键的是,这行代码完全没必要,它是导致页面跳转、破坏AJAX逻辑的元凶,直接删掉就好。
2. testPHP.php中判断数组的逻辑错误
isset($_GET)和isset($_POST)永远会返回true,因为这两个超全局数组不管有没有数据都会存在。要判断数组里是否有实际数据,应该用!empty($_GET)和!empty($_POST)。
3. AJAX响应的处理逻辑混乱
你用AJAX请求testPHP.php,但testPHP.php里输出了alert脚本和页面跳转的header——AJAX的响应是返回给发起请求的页面(test.php),而不是直接在浏览器里执行跳转,这些逻辑在AJAX场景下完全不适用。
修正后的代码
修正后的test.php
<a id="link" role="button" href="testPHP.php">Test</a> <script type="text/javascript"> $("#link").click(function(e) { e.preventDefault(); // 阻止默认的链接跳转行为 alert('function entered'); $.ajax({ url: "testPHP.php", type: "POST", data: { parameter1: 'test', parameter2: 'test2'}, success: function(msg) { alert('wow' + msg); // 如果需要跳转,在AJAX请求成功后再执行 window.location.href = 'HomePage.php'; }, error: function(xhr) { alert('请求出错了'); } }); alert('function end'); }); </script>
修正后的testPHP.php
// 处理AJAX的POST请求 if(!empty($_POST)) { // 输出POST数据给AJAX响应 print_r($_POST); // 更规范的做法是返回JSON格式数据 // echo json_encode(['status' => 'success', 'data' => $_POST]); exit; // 处理完AJAX请求后退出,避免输出多余内容 } // 处理直接访问页面的情况(非AJAX请求) if(!empty($_GET)) { echo "<script>alert('GET is there');</script>"; print_r($_GET); } else { echo "<script>alert('No post variable set');</script>"; }
关于AJAX原理的补充
AJAX的核心是异步发起HTTP请求,不刷新当前页面就能获取服务器响应。你之前用表单POST是同步请求,提交后页面会直接刷新跳转;而AJAX是在后台悄悄发送请求,响应会回到当前页面的JS代码里,由你决定怎么处理(比如弹出提示、更新页面内容,或者之后再跳转)。
这次的问题本质是把AJAX异步请求和同步页面跳转混在了一起,把两个完全独立的请求当成了同一个,所以才会看不到POST数据。
内容的提问来源于stack exchange,提问作者Tribunal

