You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJAX POST数据无法在PHP中接收,报Undefined array key错误求助

问题排查:AJAX发送数据后PHP提示Undefined array key "td"

我刚从基础开始学习PHP,实践中遇到问题且查阅资料后仍未解决。我的页面里,用户在表单输入数据后通过Add按钮添加到表格,点击Save按钮时,通过AJAX将表格数据和表单内3个未加入表格的文本框数据发送到PHP。

Save按钮的JS代码

$("#save").on("click", function (e) {
        e.preventDefault();
        debugger
        if (!iQuantity || !iDiscount) { // This is checking validation.
            $("#message").fadeIn(1000).html(`<div class="alert alert-warning">Please fill all the fields</div>`);
            $("#message").fadeOut(3000);
        } 
              
        if ($("#amountPayable").val() === "" || $("#amountPayable").val() == 0 || $("#amountPaid").val() === "" || $("#amountPaid").val() == 0 
            || $("#discountGiven").val() === "" ) {

            $("#message").fadeIn(1000).html(`<div class="alert alert-warning">Please fill all the fields</div>`);
            $("#message").fadeOut(3000);

        } else {

                var tableData = [];
                $('#addTable tbody tr').each(function () {
                    debugger
                    var rowData = {
                        itemId: $(this).find('td:eq(0)').text(),    // first column in row is trainee  (on index 0)
                        saleId: $(this).find('td:eq(1)').text(),   // second column in row is title
                        qty: $(this).find('td:eq(3)').text(),   // 4th column in row is attend
                        amount: $(this).find('td:eq(4)').text(),  // 5th column in row is trainer                        
                    };
                    tableData.push(rowData);
                });

            var formFields = {   // This takes text fields data
                amountPayable: $("#amountPayable").val(),
                amountPaid: $("#amountPaid").val(),
                discountGiven: $("#discountGiven").val(),
            };

            // Here I'm making object of both above objects.
            var dataToSend = {
                td: JSON.stringify(tableData), // Grid data
                ff: JSON.stringify(formFields), // Text fields data
            };
            

            console.log("ok");
            $("#message").html("");
            debugger
            $.ajax({
                url: "../add-pages/add-orders.php",
                type: "POST",
                data: dataToSend,
                processData: false,
                contentType: false,
                
                success: function (receivedData) {
                    debugger
                    var dt = receivedData;
                    $('#message').fadeIn(1000).html(receivedData);
                    $("#message").fadeOut(3000);

                    // --------------------------------------------- For Claring the Form Fields, ---------------------------------------------
                    $(':input', '#addOrdersData')
                        .not(':button, :submit, :reset, :hidden')
                        .val('')
                        .prop('checked', false)
                        .prop('selected', false);
                    
                    $("#update").attr("disabled", true);
                }
            });
        }
    });

PHP接收代码

<?php
     date_default_timezone_set('Asia/Karachi');

     $tableData = json_decode($_POST['td']); // Grid data
     $ff = json_decode($_POST['ff']); // Grid data
   ?>

报错信息

运行后PHP报错:Warning: Undefined array key "td" in C:\xampp\htdocs\superStore\add-pages\add-orders.php on line 4


错误原因及解决方案

核心问题

你在AJAX请求里设置了processData: false和contentType: false,这两个参数是专门用于文件上传场景的,会让jQuery跳过对发送数据的格式化处理,也不会设置默认的Content-Type请求头。但你当前发送的是普通键值对数据,这会导致PHP无法识别数据格式,自然就找不到$_POST['td']这个键。

方案一:移除多余参数(推荐)

直接删除AJAX配置里的processData: false和contentType: false,jQuery会自动把dataToSend格式化为标准的表单提交格式(application/x-www-form-urlencoded),PHP就能正常通过$_POST获取数据。

修改后的AJAX代码片段:

$.ajax({
    url: "../add-pages/add-orders.php",
    type: "POST",
    data: dataToSend,
    success: function (receivedData) {
        debugger
        var dt = receivedData;
        $('#message').fadeIn(1000).html(receivedData);
        $("#message").fadeOut(3000);

        $(':input', '#addOrdersData')
            .not(':button, :submit, :reset, :hidden')
            .val('')
            .prop('checked', false)
            .prop('selected', false);
        
        $("#update").attr("disabled", true);
    }
});

方案二:以纯JSON格式发送数据(可选)

如果想用JSON格式传递数据,需要同步调整JS和PHP代码:

  1. JS端:将数据转为JSON字符串,设置正确的Content-Type
    $.ajax({
        url: "../add-pages/add-orders.php",
        type: "POST",
        data: JSON.stringify(dataToSend),
        contentType: "application/json",
        success: function (receivedData) {
            // 原有成功回调代码
        }
    });
    
  2. PHP端:读取原始请求数据再解码
    <?php
    date_default_timezone_set('Asia/Karachi');
    $rawData = file_get_contents("php://input");
    $data = json_decode($rawData, true);
    $tableData = json_decode($data['td']);
    $ff = json_decode($data['ff']);
    ?>
    

内容的提问来源于stack exchange,提问作者user87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:05:07