I am trying to send JSON object from Javascript/Jquery to PHP and I am getting and error msg in my console. What am I doing wrong. I am new to JS and PHP.
JQuery file:
$(document).ready(function() {
var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'};
// console.log(typeof(flickr));
var makeFlickrCall = function(flickrObj){
$.ajax({
url: '../phpincl/apiConnect.php',
type: 'POST',
data: flickrObj
})
.done(function(data) {
console.log("success");
console.log(JSON.stringify(data));
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});
};
makeFlickrCall(flickr);
});
PHP file
<?php
$obj = $_POST['data'];
// print_r($obj);
return $obj;
?>
The standard jQuery .ajax()
method uses the data
property to create an x-www-form-urlencoded string to pass in the request body. Something like this
action=Flickr&get=getPublicPhotos
Therefore, your PHP script should not look for $_POST['data']
but instead, $_POST['action']
and $_POST['get']
.
If you want to send a raw JSON data payload to PHP, then do the following...
Set the AJAX contentType
parameter to application/json
and send a stringified version of your JSON object as the data
payload, eg
$.ajax({
url: '../phpincl/apiConnect.php',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(flickrObj),
dataType: 'json'
})
Your PHP script would then read the data payload from the php://input
stream, eg
$json = file_get_contents('php://input');
You can then parse this into a PHP object or array...
$dataObject = json_decode($json);
$dataArray = json_decode($json, true);
And, if you're just wanting to echo it back to the client..
header('Content-type: application/json');
// unmodified
echo $json;
// or if you've made changes to say $dataArray
echo json_encode($dataArray);
Excellent answer by Phil, however since the OP title says
send json object from javascript (not jQuery ) to php
this is how to do it with (vanilla) javascript, in case it helps somebody looking for this method:
var jsondata;
var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'};
var data = JSON.stringify(flickr);
var xhr = new XMLHttpRequest();
xhr.open("POST", "../phpincl/apiConnect.php", !0);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(data);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// in case we reply back from server
jsondata = JSON.parse(xhr.responseText);
console.log(jsondata);
}
}
Notice we still need to convert the server's response into a javascript object using JSON.parse()
Now, on the server side (based on Phil's answer) if you are sending back a response to the client, you could do:
header('Content-type: application/json');
$json = file_get_contents('php://input');
$json_decode = json_decode($json, true);
$json_encode = json_encode($json_decode);
echo $json_encode;
NOTE:
The reason behind decoding first and then encoding back the raw json input is to properly escape slashes in (possible) URLs within the data, e.g.
json_encode
will convert this URL
http://example.com
into
http:\/\/example.com
... which is not the case in the OP but useful in some other scenarios.
Use:
makeFlickrCall( { data: JSON.stringify( flickr )} );
Instead of
makeFlickrCall(flickr);
Your server-side script should receive your JSON as follows:
data="{"action":"Flickr","get":"getPublicPhotos"}"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With