PHP表单GET参数转JSON返回后fetch请求无法获取正确数据如何解决
问题原因分析
- PHP超全局变量
$_GET无论有没有携带参数都会始终存在,你写的isset($_GET)判断永远返回真,兜底逻辑不会生效 - Checkbox控件未勾选时,浏览器不会将其参数随请求提交。如果你提交表单时未勾选任何选项、未点击
sendData提交按钮,或者用fetch发起请求时未携带任何GET参数,$_GET就为空,自然触发无数据的返回 - 现有代码中
$noData对象未提前初始化,直接赋值属性会抛出PHP警告,返回的JSON结构可能存在异常
修复方案
1. 后端代码修正(queries.php)
增加session存储逻辑,方便后续请求复用提交的数据,同时修复原有代码的语法问题:
<?php // 开启session,用于同一用户的多请求间共享数据 session_start(); // 直接取$_GET即可,超全局变量必然存在 $data = $_GET; if (!empty($data)) { // 将提交的数据存入session,后续请求可直接读取 $_SESSION['form_data'] = $data; echo json_encode($data); } else { // 先初始化对象,避免PHP警告 $noData = new stdClass(); $noData->Message = "No data passed"; // 如有需要可以在无新提交数据时返回历史存储的数据,取消下方注释即可 // if (isset($_SESSION['form_data'])) { // $noData->historyData = $_SESSION['form_data']; // } echo json_encode($noData); } ?>
2. 提交请求的注意事项
- 页面内点表单提交:勾选对应选项后点击
Send按钮,即可正常拿到勾选参数对应的JSON结果 - 用fetch发起异步请求:需要手动把参数携带在请求URL中,示例如下:
// 示例:提交name1、name2为选中状态的请求 fetch('queries.php?name1=on&name2=on&sendData=Send') .then(res => res.json()) .then(data => console.log(data))
可选优化:让未勾选的Checkbox也返回参数
如果需要不管是否勾选都返回所有name1/name2/name3的参数,可以在每个checkbox前加一个同name的隐藏输入框,避免参数缺失:
echo "<form method='GET' action='queries.php'> <label>name1</label> <input type='hidden' name='name1' value='off'/> <input type='checkbox' name='name1' value='on'/> <label>name2</label> <input type='hidden' name='name2' value='off'/> <input type='checkbox' name='name2' value='on'/> <label>name3</label> <input type='hidden' name='name3' value='off'/> <input type='checkbox' name='name3' value='on'/> <input type='submit' name='sendData' value='Send'/> </form>";
勾选时参数值为on,未勾选时为off,不会出现参数缺失的情况。
后续请求使用数据的方法
同一个用户的其他PHP接口中,只要在代码开头加上session_start(),就可以通过$_SESSION['form_data']读取到之前提交的表单数据。
内容的提问来源于stack exchange,提问作者Aogiri14
相关产品推荐
相关产品推荐

