Сформируйте пустые переменные $_POST в обработчике PHP

#php #jquery #ajax #forms #post

#php #jquery ( jquery ) #аякс #формы #Публикация

Вопрос:

Я преобразовал рабочую форму для использования StepWizard от Bootstrap, и теперь, когда форма отправляется с помощью того же метода Ajax, что и в предыдущей форме, обработчик PHP сообщает, что все переменные имеют значение null.

Вызов 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
amp;fName=Ross
amp;lName=Waddell
amp;phone=555 555 1212
amp;email=a@b.com
amp;modelName=
amp;remarks=
amp;category=
amp;securedToBase=Yes
amp;acceptAgrmt=
amp;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;
        }
    });
 

ПРАВКА2
Глядя на сетевой трафик в инструментах разработчика Chrome, я вижу строки для моего PHP-обработчика (formSubmit_TAB_WIZ.php ) но только один выглядит как СООБЩЕНИЕ, когда я фильтрую по «методу: СООБЩЕНИЕ». Но независимо от того, что я делаю с точки зрения того, как я вызываю вызов Ajax, я вижу две записи в моем PHP logger: первая содержит все входные значения, а вторая имеет все null. Что, черт возьми, здесь происходит?

введите описание изображения здесь

EDIT3 Похоже, что 2-й запрос является 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"
 

Комментарии:

1. Как запускается JS-код? Это происходит при нажатии кнопки отправки формы? Если да, то отменили ли вы событие отправки формы?

2. сурли 'fName' => $_POST["fName"], НЕТ '$_POST["fName"]' => $_POST["fName"], и то же самое для всех остальных

3. @RoryMcCrossan: Да, у меня есть e.preventDefault(); в моем $(«#EntryForm»).on(«submit», функция (e) {}). Эта функция одинакова как для старой, так и для новой формы и не изменилась.

4. @RiggsFolly: это просто для того, чтобы я мог видеть в своем пользовательском файле журнала, откуда берется значение (оно добавляет первую часть в виде текста, а затем вторая часть — фактическое значение)

5. Я подключил отладчик, и похоже, что форма публикуется дважды — в первый раз я вижу правильные значения переменных $ _POST, но на 2-м все они равны нулю. Почему я получаю две отправки формы?

Ответ №1:

Получение происходит из перенаправления в функции успеха 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 были из 2-го запроса GET, поскольку, естественно, переменные $_POST были нулевыми.