PHP 处理程序中的表单 $_POST 变量为空

Posted

技术标签:

【中文标题】PHP 处理程序中的表单 $_POST 变量为空【英文标题】:Form $_POST Variables empty in PHP Handler 【发布时间】:2021-04-10 11:45:39 【问题描述】:

我已经将一个工作表单转换为使用 Bootstrap 的 StepWizard,现在当表单通过与以前的表单相同的 Ajax 方法提交时,php 处理程序说 所有 变量为空。

Ajax 调用

    // Put the form data into a serialized string and make Ajax call
    var formData = $("#entryForm").serialize();

    console.log(formData);

    $.ajax(
        method: "POST",
        url: "/contest/entry/php/formSubmit_TAB_WIZ.php",
        data: formData,
        global: true,   // SHOW MODAL FOR THIS AJAX REQUEST VIA AJAX START/STOP
        success: function (result)
//            console.log('in success function; result=' + result);
//            if (result === 'SUCCESS') 
//                location.href = "/contest/entry/php/printout_TAB_WIZ.php";
                location.href = "/contest/entry/php/formSubmit_TAB_WIZ.php";
//             else 
//                //alert(result);
//                jqUIAlert(result, false);
//            
        ,
        error: function (jqXHR, textStatus, errorThrown) 
            //console.log('In error function; jqXHR=' + jqXHR.status);
            //console.log('In error function; textStatus=' + textStatus);
            //console.log('In error function; errorThrown=' + errorThrown);

            //alert('Error processing Ajax request (formSubmit): ' + jqXHR.status + ' ' + errorThrown);
            jqUIAlert('Error processing Ajax request (formSubmit): ' + jqXHR.status + ' ' + errorThrown, false);
        ,
        complete: function (jqXHR, textStatus) 
            $("input[type=submit]").removeAttr("disabled");
            $("input[type=submit]").val('Submit');            
        
    );

控制台显示序列化数据就好了(为了清楚起见,我在每个参数后添加了换行符):

token=aa5077b808388b52050aba342f11a7c3fd4c9d37ebe9f7e94425edeaf1b20920
&fName=Ross
&lName=Waddell
&phone=555%20555%201212
&email=a%40b.com
&modelName=
&remarks=
&category=
&securedToBase=Yes
&acceptAgrmt=
&g-recaptcha-response=03AGdBq25_SV2ouAUrzAs_QsbEVZcmJUGEXrQXmRYBSQbZhtoyTKwI0xmIodkozOt0l9jntAqqwaJH-QqYWJj_tF127jDbi00XBVv9AGa2nX5wZRf_uj8RuosO7NnGP4i6BiiFi5lPmgau6we_9gKu84QHpFQ-tlB_HtYNouPWtDgyjCeasIo1noqbjfBZz1BsSWhmyCPHDoq9A4P1u_cYWtY67U9jFSFhEimHVNakdpsnnPsSqDW8Uf9puLnZG5EjuKm5RV5kdaNMPH64DGpmJTnQzepz6G2T56_CASy1mYstOmBvSv22p3ZpmY2hUMPkVR_2WdixAdBb_JwQtgyfA6zrfG9FJLo7aQ4gHwQd8n5Zh1M5XMH9HDusrAlopNcPfLtCGyg573T5CwJtTr0wzQuguvlftCL-bT8uDTcpQzj8ZqtV2-XMc5GFDwpeRB2vJKyX2DcIbVHa

但我的 PHP 处理程序会抛出错误(这仅适用于 $_POST 变量之一):

PHP Notice:  Undefined index: fName in /public_html/contest/entry/php/formSubmit_TAB_WIZ.php on line 35

PHP 处理程序(formSubmit_TAB_WIZ.php):

<?php 
    // include setConfig
    require_once '../../../../private/contest/include/setConfig.php'; 
    
    // include startSession
    require_once '../../../../private/contest/include/startSession.php';    

    
    startWFsession('entry_form');
        
    $sessionToken = isset($_SESSION['token']) ? bin2hex($_SESSION['token']) : '';
    
    $log->debug('formSubmit.php: starting/loading session', 
    array('file:' => basename(__FILE__), 
            'line#:' => __LINE__,
            'session_id' => session_id(),
            '$_SESSION["token"]' => $sessionToken)); 
        
    
    $_SESSION['current_time'] = time();

//    print_r($_POST);
    
//    $post_data = file_get_contents('php://input');
//    echo $post_data;
    
    $ip =  getUserIP();  
    $sessionID = session_id();
    
    $log->debug('POST variables from new TAB WIZARD form:', 
            array('file:' => basename(__FILE__), 
                    'line#:' => __LINE__,
                    'session_id' => $sessionID,
                    'IP' => $ip,
                    '$_POST["token"]' => $_POST["token"],
                    '$_POST["fName"]' => $_POST["fName"],
                    '$_POST["lName"]' => $_POST["lName"],
                    '$_POST["phone"]' => $_POST["phone"],
                    '$_POST["email"]' => $_POST["email"],
                    '$_POST["modelEntryList"]' => $_POST["modelEntryList"]
            ));      

    die();

令人困惑的是旧形式仍然可以正常工作,使用相同的 Ajax 调用和类似的 PHP 代码(所以我知道这不是 PHP.ini 属性值的情况)。我已经通过一个 HTML 验证器运行了新表单,并且所有的都签出了 - 所有表单名称都是唯一的,并且它正在正确序列化。

我已经尝试调试了好几天,但没有成功 - 有人能指出我正确的方向吗?

编辑 我的表单提交按钮的 HTML:

<input type="submit" id="formsubmit" name="mysubmit" class="btn btn-danger pull-right" value="Submit">

防止默认提交的JS代码

    $("#entryForm").on("submit", function(e) 
        // Triggered by form submission: do all field validations
  
        //console.log('In $("#entryForm").on("submit", function() ...');
  
        // Disallow browser form submission
        e.preventDefault();    

        var oForm = document.forms["entryForm"];
        //var oForm = $('form[name="entryForm"]');  Easier to use pure JS here
          
        // User has to check Terms and Conditions for new entry
        if(!oForm.elements["acceptAgrmt"].checked) 
            oForm.elements["acceptAgrmt"].focus();
            //alert("Please accept the Terms and Conditions.");
            jqUIAlert("Please accept the Terms and Conditions.", false);
            return false;
        
  
        if (validateForm(oForm)) 
            //console.log('Validation succeeded.');
  
            // Validation succeeded, so now explicitly call reCAPTCHA check
            grecaptcha.execute();  
         else 
            //console.log('Validation failed; preventing form submission');
            return false;
        
    );

EDIT2 查看 Chrome 开发人员工具中的网络流量,我看到了我的 PHP 处理程序 (formSubmit_TAB_WIZ.php) 的行,但是当我按“方法:POST”过滤时,只有一个看起来像 POST。但无论我如何调用 Ajax 调用,我都会在我的 PHP 记录器中看到两条记录:第一条记录所有输入值,第二条记录全部为空。这是怎么回事?

EDIT3 看起来第二个请求是 GET - 但为什么呢?

192.168.1.18 - - [05/Jan/2021:20:28:16 -0500] "POST /contest/entry/php/formSubmit_TAB_WIZ.php HTTP/1.1" 200 1907 "http://wonderfest:8000/contest/entry/entryForm_TAB_WIZ_v4.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
192.168.1.18 - - [05/Jan/2021:20:28:16 -0500] "GET /contest/entry/php/formSubmit_TAB_WIZ.php HTTP/1.1" 200 238 "http://wonderfest:8000/contest/entry/entryForm_TAB_WIZ_v4.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"

【问题讨论】:

JS代码是怎么触发的?是点击表单的提交按钮吗?如果是,您是否取消了表单提交活动? surley 'fName' =&gt; $_POST["fName"], NOT '$_POST["fName"]' =&gt; $_POST["fName"], 其他人也一样 @RoryMcCrossan:是的,我有 e.preventDefault();在我的 $("#entryForm").on("submit", function(e) ) 中。旧形式和新形式的功能相同,没有改变。 @RiggsFolly:这样我就可以在我的自定义日志文件中看到值的来源(它将第一部分添加为文本,然后第二部分是实际值) 为什么投反对票?你能不建议修改吗? 【参考方案1】:

GET 来自 Ajax 成功函数中的重定向:

$.ajax(
    method: "POST",
    url: "/contest/entry/php/formSubmit_TAB_WIZ.php",
    data: formData,
    global: true,   // SHOW MODAL FOR THIS AJAX REQUEST VIA AJAX START/STOP
    success: function (result)
        console.log('in success function; result=' + result);
        if (result === 'SUCCESS') 
            location.href = "/contest/entry/php/formSubmit_TAB_WIZ.php";
         else 
            //alert(result);
            jqUIAlert(result, false);
        
    ,
    error: function (jqXHR, textStatus, errorThrown) 
        jqUIAlert('Error processing Ajax request (formSubmit): ' + jqXHR.status + ' ' + errorThrown, false);
    ,
    complete: function (jqXHR, textStatus) 
        $("input[type=submit]").removeAttr("disabled");
        $("input[type=submit]").val('Submit');            
    
);

我想查看页面上的变量值,所以我在这里使用了相同的 PHP 处理程序,但它当然变成了 GET。所以,第一个请求实际上工作正常,但我的 php_error.log 中的错误来自第二个 GET 请求,因为 $_POST 变量自然为空。

【讨论】:

以上是关于PHP 处理程序中的表单 $_POST 变量为空的主要内容,如果未能解决你的问题,请参考以下文章

PHP:检查任何已发布的变量是不是为空 - 表单:所有字段都是必需的

使用PHP处理POST上传时$_FILES数组为何为空

PHP表单-PHP $_POST 变量

PHP 从 Ajax 调用接收空的 $_POST 变量

PHP中的$_POST

PHP表单