AJAX POST提交到PHP-到达PHP时POST为空



我正在通过AJAX向我的PHP脚本提交POST请求。浏览器工具Network选项卡显示POST数据有值,到达我的PHP脚本时,$_POST值为true,isset()验证有效,将$_POST['input']值分配给我的$variables应该没有问题。

然而,我的调试栏告诉我,像$first_name这样的PHP变量实际上是空的。我在这里感觉很愚蠢,我错过了什么?

AJAX

$('#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',
data: {
action: 'add_new_user',
user_data: $('#addNewUser').serialize()
},
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;
}
});

浏览器网络选项卡:

Request Data
MIME Type: application/x-www-form-urlencoded; charset=UTF-8
action: add_new_user
user_data: first_name=John&last_name=Doe

PHP

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>';
// sanitize
$fn = mysqli_real_escape_string($db, $_POST['first_name']);
$ln = mysqli_real_escape_string($db, $_POST['last_name']);
}
}

响应:

<b>Notice</b>:  Undefined index: first_name in <b>/path/to/script/admin_addNewUser.php</b> on line <b>27</b><br />
<br />
<b>Notice</b>:  Undefined index: last_name in <b>/path/to/script/admin_addNewUser.php</b> on line <b>28</b><br />

感谢在这方面的任何帮助,我已经盯着这个看了太久了。感谢

您发送的data对象错误。将Serialize函数作为对象元素发送,将其作为字符串发送。所以数据对象的输出将类似于


data: {
"action": "add_new_user",
"user_data": "first_name=val&last_name=anotherval"
}

wich将在PHP端被解析为一个数组。

所以你需要更换

data: {
action: 'add_new_user',
user_data: $('#addNewUser').serialize()
}

通过类似的方式:

data: $('#addNewUser').serialize() + '&action=add_new_user'

或者,在PHP端,您需要将user_data查询字符串解析为如下数组:

if (isset($_POST['user_data'])) {
parse_str($_POST['user_data'], $userData);
// then you can 
if (isset($userData['first_name'])) {
// ....
}
}

在您的ajax对象中,如果您看到数据属性,您将看到first_name不是直接发送的。它在";user_ data";变量

您需要使用$_POST[user_data]=来获取表单的详细信息。

此外,如果您将来发现任何类似的查询,只需使用print_r($_POST)来查看您从POST请求中得到了什么。

谢谢。

最新更新