我正在通过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请求中得到了什么。
谢谢。