#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 были нулевыми.