使用Fetch POST传递Select数据到PHP后端时的Undefined array key报错排查
问题
我希望通过fetch的POST方法将select组件的数据传递到PHP后端,用于SQL语句执行。以下是我的实现代码(注:select的选项由其他脚本动态生成):
<div class="col-md-4"> <label for="ImpiantoBatt" class="form-label">Impianto (proprietario e indirizzo)</label> <select id="ImpiantoBatt" name="ImpiantoBatt" class="form-select-ImpiantoBatt" required onchange="scelta('ImpiantoBatt', this)"> <option value="">Seleziona</option> </select> </div>
对应的脚本:
<script> function scelta(ImpiantoBatt, element) { const data = { ID: document.getElementById(ImpiantoBatt).value } fetch("php/batteries_search.php", { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json; charset=UTF-8" } }) .then((data) => console.log(data)) </script>
控制台返回状态码200的Response对象,且前端可正确输出数据(例如{ID: '7'})。但后端使用$plantID = ($_POST['data']);接收数据时,出现警告:Warning: Undefined array key "data"。请问错误出在哪里?
解决方案
核心问题:前端发送的是JSON格式数据,但PHP的$_POST只能解析**表单编码(application/x-www-form-urlencoded)**类型的数据,无法直接读取JSON格式的请求体。你用JSON.stringify(data)发送的是纯JSON字符串,所以$_POST里自然没有data这个键。
这里提供两种可行的解决办法:
办法一:修改前端,发送表单编码格式数据
把fetch的请求体改成FormData或URLSearchParams格式,这样PHP就能直接用$_POST读取:
function scelta(ImpiantoBatt, element) { const data = new FormData(); data.append('ID', element.value); // 直接用element.value更简洁,无需重复getElementById fetch("php/batteries_search.php", { method: "POST", body: data // 无需手动设置Content-Type,浏览器会自动添加正确的请求头 }) .then(response => response.text()) // 先解析响应内容,否则console.log的是Response对象本身 .then(result => console.log(result)) }
后端接收代码:
$plantID = $_POST['ID']; // 直接读取ID字段
办法二:修改后端,直接读取JSON请求体
如果坚持用JSON格式发送数据,后端需要直接读取PHP的输入流来解析:
// 读取请求体中的JSON字符串 $jsonData = file_get_contents('php://input'); // 将JSON解析为关联数组 $data = json_decode($jsonData, true); // 获取ID值 $plantID = $data['ID'];
这种方式不依赖$_POST,直接解析原始请求数据。
内容的提问来源于stack exchange,提问作者Andry
相关产品推荐
相关产品推荐

