This question already has answers here:
Issue reading HTTP request body from a JSON POST in PHP [duplicate]
(2 answers)
Closed 4 years ago.
I am trying to pass a Json obtained by a json.stringify process of an html table to a php file to insert it into a database.
First,wanted to check is the code below is ok : i get the right output of the json when doing an alert of 'myjson':
var myjson= JSON.stringify(mydata);
alert(myjson);
[{},{"product[]":"john","qty[]":"288","price[]":"199","total[]":"57312"},{"product[]":"sylvia","qty[]":"12","price[]":"13","total[]":"156"},{"product[]":"juan","qty[]":"11","price[]":"9","total[]":"99"},{"total_amount":"57567.00"}]
then i have this ajax to send it to php (test.php):
$.ajax({
url: "test.php",
type: "POST",
data: myjson,
dataType: "JSON",
success: function (data) {
alert(data);
}
});
And my php file to check if the output is fine:
$obj = json_decode($_POST["mydata"]);
echo $obj->var;
but i do not get anything in my alert once the php is supposedly processed?
what is wrong?
Firstly, you will need to post the data with a name, more specifically with the name "mydata".
Currently the PHP looking for a post called mydata ($_POST["mydata"]) which is not available and throws the following Notice Undefined index: mydata
To do that, you can change the data you're sending from:
data: myjson
to
data: {"mydata": myjson}
Second, the data sent to the back-end is an array of objects
Array
(
[0] => stdClass Object
(
)
[1] => stdClass Object
(
[product[]] => john
[qty[]] => 288
[price[]] => 199
[total[]] => 57312
)
[2] => stdClass Object
(
[product[]] => sylvia
[qty[]] => 12
[price[]] => 13
[total[]] => 156
)
[3] => stdClass Object
(
[product[]] => juan
[qty[]] => 11
[price[]] => 9
[total[]] => 99
)
[4] => stdClass Object
(
[total_amount] => 57567.00
)
)
You will need to access them by index or iterate through the array.
Access them by index: $obj[0]->var or $obj[1]->var
Last but not least, the properties contain square brackets {"product[]":"john","qty[]":"288","price[]":"199","total[]":"57312"} which is not recommended but will still work. Accessing the properties should be done like: $obj[1]->{'property[]'}
JavaScript:
<script type="text/javascript">
function sendAjax(){
var mydata = [{}, {"product[]":"john","qty[]":"288","price[]":"199","total[]":"57312"}, {"product[]":"sylvia","qty[]":"12","price[]":"13","total[]":"156"},{"product[]":"juan","qty[]":"11","price[]":"9","total[]":"99"},{"total_amount":"57567.00"}]
var myjson = JSON.stringify(mydata);
$.ajax({
url: "test.php",
type: "POST",
data: {"mydata": myjson},
dataType: "JSON",
success: function (data) {
alert(data);
}
});
}
</script>
PHP:
<?php
$obj = json_decode($_POST["mydata"]);
echo $obj[1]->{'product[]'};
?>
Update:
The AJAX is expecting a JSON response, otherwise it will fail. In the Back-End you will need to change the response to JSON.
<?php
$obj = json_decode($_POST["mydata"]);
header('Content-Type: application/json');
echo json_encode($obj[1]->{'product[]'});
?>
Related
I have a large multi-dimensional object of arrays in JS that I am trying to pass to PHP using Ajax. The keys of some of the array values are written arrays test[key], and in PHP I want them to be read as such test => array([key] => 123). Note, I am working in Wordpress.
Working example
JS:
var args = {
'action' : 'save',
'test[key1]' : ['123', 'abc']
}
var request = $.ajax({
url: settings.get('ajaxurl'),
data: args,
type: 'post',
success: function(response) { // }
});
PHP print_r on output:
[action] => save
[test] => Array
(
[key1] => Array
(
[0] => 123
[1] => 234
)
)
However, I want to send all of the test[key1] (and a lot more data) at the second level of the object. I have a lot of data and need them grouped accordingly.
Not working example
JS:
// simple changing the args
var args = {
'action' : 'save',
'data' : {
'test[key1]' : ['123', 'abc']
}
}
PHP print_r on output:
[action] => save
[data] => Array
(
[test[key1] => Array
(
[0] => 123
[1] => 234
)
)
This seems to be really difficult to explain - but it looks like PHP isn't parsing the array keys properly when it's not on the top level of the array. Am I doing something wrong // is there a way around this? I can provide more insight if needed, I attempted to make this as clear as possible.
When printing the keys of the data array, it prints them without the final ]. So it shows test[key1 instead of what I am expecting. Maybe they get stripped somewhere?
I think you need to stringify the data
var request = $.ajax({
url: settings.get('ajaxurl'),
data: JSON.stringify(args),
type: 'post',
success: function(response) { // }});
Then use json_decode to make it useful in PHP.
Edit:
This might get you where you want to go...
var args = {
'action' : 'save',
test : {
key1 : [
'123',
'abc' ]
} }
Since JavaScript does not allow for associative arrays.
Please try this args, this will give multi-dimensional array result.
var args = {
'action' : 'save',
'data' : {
'test': {
'key1' : ['123', 'abc']
}
}
}
I have a PHP script that sends this array to the client via ajax:
Array
(
[0] => $209.90
[1] => $20.99
[2] => $188.91
)
I am sending the array to the client this way:
return $servicePrices;
I have this jQuery statement:
success: function(data) {
//console.log('Success'+data);
$( '#tourSubtotal' ).val( data[0] );
$( '#tourDiscount' ).val( data[1] );
$( '#tourTotal' ).val( data[2] );
},
My results for each ID value are A, r and r. Instead, how can I get the 3 currency data values from the array in my ajax jQuery?
It looks like you are using print_r() function to display this:
Array
(
[0] => $209.90
[1] => $20.99
[2] => $188.91
)
In that format it's just as useful as any string is. You have to use json_encode() to convert it to a format both languages understand like:
["$209.90", "$20.99", "$188.91"]
Your PHP code should be something like:
<?php
$json = some_value;
// Remove this:
// print_r($json);
// Instead, write this:
echo json_encode($json);
?>
And then you can use it in JavaScript, the way you have specified. Also, jQuery is smart enough to understand that the response is JSON and you don't need JSON.parse() in most of the cases.
You can return the array in a JSON encoded format from PHP as mentioned below:
$result = array(
'0' => '$209.90'
'1' => '$20.99'
'2' => '$188.91'
);
return json_encode($result);
And on the AJAX success function you can use :
success: function(data) {
var temp = JSON.parse(data);
$( '#tourSubtotal' ).val( temp[0] );
$( '#tourDiscount' ).val( temp[1] );
$( '#tourTotal' ).val( temp[2] );
},
Hope this helps.
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 6 years ago.
Improve this question
Hello overflowers!
The problem i'm stuck on at the moment is following.
I have managed to add a "✓" to selected users.
I have added a "data-id" attribute to each listed user.
The thing I'm trying to figure out is how I have post the users data-id from jquery to my php page.
Jquery:
task_takers = [];
var i = 0;
$(".new-task-takers ul.select_takers li").each(function(){
$(this).click(function(){
$(this).toggleClass("active");
if($(this).find('.fa').length > 0){
$(this).find('.fa').remove();
}else{
$('<i class="fa fa-check" aria-hidden="true"></i>').insertBefore($(this).find("div"));
}
console.log("Selected:", $(this).data("id"));
i += 1;
task_takers[i] = $(this).data("id");
console.log(task_takers);
console.log(i);
});
});
console.log(task_takers);
PHP:
$task_takers = isset($_POST['task_takers']) ? $_POST['task_takers'] : NULL;
var_dump($task_takers);
All I'm getting is a NULL
Edit:
I got it too work, but the thing is the array is getting flooded if you select the user and un-select and re-select.
Array:
[1: 2, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3]
As you can see it spams ID: 3
You have to send data to the php script in order to make it work.
Here is a little example of jQuery.ajax from the docs :
$.ajax({
method: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }
})
.done(function( msg ) {
alert( "Data Saved: " + msg );
});
I usually use it as following :
$("form").submit(function(){
$.ajax({
type: 'POST',
url: "/relative/path/to/php/script.php",
data: $("form").serialize(),
success: function(data) {
console.log(data)
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
}
});
});
Hope it helps.
EDIT
Since your last edit :
You could solve this by using array_unique to remove duplicated items of the array from the PHP script.
For example :
php > $arr = array("1" => 2, "2" => 3, "3" => 3, "4" => 3, "5" => 3, "6" => 3);
php > print_r($arr);
Array
(
[1] => 2
[2] => 3
[3] => 3
[4] => 3
[5] => 3
[6] => 3
)
php > $uniq_arr = array_unique($arr);
php > print_r($uniq_arr);
Array
(
[1] => 2
[2] => 3
)
I have a form and I am sending it with ajax to server.
Like this:
$.ajax({
url: form.attr('action'),
type: 'POST',
data: form.serialize(),
dataType : 'json',
success: function(data){
}
});
And I receive in server something like
Array
(
[forms_element_1] => 'some value 1',
[forms_element_2] => 'some value 2',
[forms_element_3] => 'some value 3'
)
Now i need to add to this form global variable that is array itself.
var statuses = [5,7,3];
I need to receive from POST in server side something like
Array
(
[forms_element_1] => 'some value 1',
[forms_element_2] => 'some value 2',
[forms_element_3] => 'some value 3',
[statuses] => Array
(
[0] => 5,
[1] => 7,
[2] => 3
)
)
How can I achieve that in jQuery?
Turn it into a param string with $.param, then append it to the serialized form (which is also a param string).
data: form.serialize() + "&" + $.param({statuses:[5, 7, 3]}),
I have the following code:
var data_str = $('form').serialize();
alert(data_str);
$("#SerializeTXT").text(data_str).show();
$.ajax( {
type: 'POST',
url: 'test.php',
data: data_str,
success: function(data) {
$('#result').html(data);
}
});
Here is my test.php and the result:
<?php print_r($_POST);?>
in the #result i get
Array ( [itemIDhidden] => 2640 [SelectQt] => 1 [Bread] => Black Bread_0 [Cheese] => American_0 [Toppings] => Bacon_0 [Description] => TWSTE 3 45 T4 )
In the SerializeTXT I get
itemIDhidden=2640&SelectQt=1&Bread=Black+Bread_0&Cheese=American_0&Toppings=Sauteed+Mushrooms_0&Toppings=Fried+Onions_0&Toppings=Bacon_0&Description=TWSTE+3+45+T4
You can see that the post gets only the last element of the multiple selected element. In SerializeTXT div i get exactly what is selected from the form.
Any ideas and how can I obtain all those parameters in the php file?
Thank you in advance.
Change your select element's name from Toppings to Toppings[]
<select name="Toppings" ...
to
<select name="Toppings[]" ...
Then $_POST['Toppings'] will be an array.
var form = $('form');
var data_str = '';
form.find('input, select, textarea').each(function()
{
data_str += $(this).attr('name')+'='+$(this).val()+'&';
});
$.ajax( {
type: 'POST',
url: 'test.php',
data: data_str,
success: function(data) {
$('#result').html(data);
}
});
};
test.php
print_r($_POST); returns
Array ( [itemIDhidden] => 2643 [SelectQt] => 1 [Bread] => Multi-Grain Bun_0 [Cheese] => American_0,Swiss_0 [Toppings] => Fried Onions_0,Bacon_0,Raw Onion_0 [Description] => TEST TEST TEST [CancelItemForm] => Cancel [BasketItem] => Confirm ).
This array can be easily manipulated in the PHP file. I hope this helps to some of the people outside