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' => $_POST["fName"],
NOT '$_POST["fName"]' => $_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 变量为空的主要内容,如果未能解决你的问题,请参考以下文章