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

AJAX POST提交数据到PHP,Network显示有值但$_POST对应字段为空

问题根因

你在前端AJAX提交时,将表单序列化生成的first_name=John&last_name=Doe字符串作为user_data字段的值封装发送,后端$_POST数组实际结构如下:

$_POST = [
    'action' => 'add_new_user',
    'user_data' => 'first_name=John&last_name=Doe'
];

first_name、last_name并不是$_POST的顶层键,直接读取自然会报未定义索引错误。


解决方案

两种修改方案可选,更推荐第一种:

方案1:修改前端提交逻辑(推荐)

把action参数和表单字段合并后提交,让所有表单字段直接成为POST顶层参数,后端原有逻辑无需改动:

$('#newUserSubmit').click(function() {
    console.log('Submit button clicked.');

    if ($('#addNewUser').valid()) {
        console.log('Form on submit is valid');

        $.ajax({
            type: 'POST',
            url: '../../controllers/admin_addNewUser.php',
            // 合并表单字段与action参数
            data: $('#addNewUser').serializeArray().concat([{name: 'action', value: 'add_new_user'}]),
            cache: false,
            success: function(data) {
                alert(data);
                console.log('Ajax POST request successful.');
            },
            error: function(xhr, status, error) {
                console.log('Ajax POST request failed.');
                console.error(xhr);
            }
        });

    } else {
        console.log('Form on submit is invalid');
        return false;
    }
});

方案2:修改后端解析逻辑

如果不便改动前端,直接在后端解析user_data字段内的序列化字符串即可:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $debug_msg = 'POST check: passed<br>';

    if (isset($_POST['action']) && ($_POST['action'] == 'add_new_user')) {
        $debug_msg .= 'ISSET check: passed<br>';
        // 解析user_data内的表单参数
        parse_str($_POST['user_data'], $user_data);
        // sanitize
        $fn = mysqli_real_escape_string($db, $user_data['first_name']);
        $ln = mysqli_real_escape_string($db, $user_data['last_name']);

    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:36:04