I am submitting a POST request via AJAX to my PHP script. The browser tools Network
tab shows the POST data has values, on arrival at my PHP script the $_POST
value is true, isset()
verification is valid, and there should be no problem to assign the $_POST['input']
values to my $variables
.
Yet, my debug bar tells me that the PHP variables like $first_name
are infact empty. I am feeling very stupid here, what am I missing?
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;
}
});
Browser Network Tab:
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']);
}
}
Response:
<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 />
Appreciate any help on this, been staring at this for too long already. Thanks
CodePudding user response:
you are sending the data
object wrong. Sending the Serialize
function as an object element will send it literally as a string. so the output for your data obj will be something like
data: {
"action": "add_new_user",
"user_data": "first_name=val&last_name=anotherval"
}
wich will be parsed as an array on the PHP side.
So you will need to replace the
data: {
action: 'add_new_user',
user_data: $('#addNewUser').serialize()
}
by something like:
data: $('#addNewUser').serialize() '&action=add_new_user'
OR in PHP side you will need to parse the user_data
query string into an array like the following:
if (isset($_POST['user_data'])) {
parse_str($_POST['user_data'], $userData);
// then you can
if (isset($userData['first_name'])) {
// ....
}
}
CodePudding user response:
In your ajax object, if you see the data attribute, you'll see that first_name is not sending directly. It is in the "user_data" variable.
You need to use $_POST[user_data]
= to get the details of the form.
Also if you find any query like this in the future, just use print_r($_POST)
to see what you are getting from the POST request.
Thank you.