Retrieve JSON POST data in CodeIgniter
Solution 1
General method I use for my Ajax Calls in CI :
JS :
post_array =
{
"myvar" : "value1",
"myvar2": "value2"
}
$.post(baseUrl + "/AjaxController/my_function", post_array,
function(data)
{
var res = jQuery.parseJSON(data);
alert(res.property);
}
Controller :
public function my_function()
{
$myvar = $this->input->post('myvar');
$myvar2 = $this->input->post('myvar2');
//Stuff
echo json_encode($myobject);
}
Solution 2
I had the exact same problem. CodeIgniter doesn't know how to fetch JSON. I first thought is about the encoding Because I use fetch.js
and not jQuery
. Whatever I was doing I was getting an notting. $_POST
was empty as well as $this->input->post()
. Here is how I've solved the problem.
Send request (as object prop -- because your js lib might vary):
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
ready: 'ready'
})
Node: I encode my data of type
object
intojson
.jQuery
does this by itself when you set thedataType: 'JSON'
option.
CodeIgniter (3.1 in my case):
$stream_clean = $this->security->xss_clean($this->input->raw_input_stream);
$request = json_decode($stream_clean);
$ready = $request->ready;
Note: You need to clean your
$this->input->raw_input_stream
. You are not using$this->input->post()
which means this is not done automatically by CodeIgniter.
As for the response:
$response = json_encode($request);
header('Content-Type: application/json');
echo $response;
Alternatively you can do:
echo $stream_clean;
Note: It is not required to set the
header('Content-Type: application/json')
but I think it is a good practice to do so. Therequest
already set the'Accept': 'application/json'
header.
So, the trick here is to use $this->input->raw_input_stream
and decode your data by yourself.
Solution 3
I had the same problem but I found the solution.
This is the Json that I am sending [{"name":"JOSE ANGEL", "lastname":"Ramirez"}]
$data = json_decode(file_get_contents('php://input'), true);
echo json_encode($data);
This code was tested and the result is [{"name":"JOSE ANGEL","lastname":"Ramirez"}]
Solution 4
Although OP seems satisfied, choosen answer doesn't tell us the reason and the real solution . (btw that post_array is not an array it's an object indeed ) @jimasun's answer has the right approach. I will just make things clear and add a solution beyond CI.
So the reason of problem is ;
Not CI or PHP, but your server doesn't know how to handle a request which has an application/json content-type. So you will have no $_POST data. Php has nothing to do with this. Read more at : Reading JSON POST using PHP
And the solution is ; Either don't send request as application/json or process request body to get post data.
For CI @jimasun's answer is precise way of that.
And you can also get request body using pure PHP like this.
$json_request_body = file_get_contents('php://input');
Solution 5
You only have your own answer.
print_r($_POST);
Return :
Array
(
[id] => 234
[qty] => 1
[price] => 0.00
[name] => dasdadsd2q3e!@!@@
)
Then how will you get : echo $id = $this->input->post('productDetails');
You will get id by echo $id = $this->input->post('id');
Abhinav
I am passionate about Cyber Security, Networking, Computer Architecture and have the thirst for learning how things work at a low level. A programmer who loves to code in PHP and Javascript, alongside a cup of tea. As of now, getting my hands dirty with React Native and loving every moment of it
Updated on December 19, 2020Comments
-
Abhinav over 3 years
I have been trying to retrieve JSON data from my php file.Its giving me a hard time.This is my code
Code in my VIEW:
var productDetails = {'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle}; var base_url = '<?php echo site_url() ?>'; $.ajax({ url: "<?php echo base_url() ?>index.php/user/Add_to_cart/addProductsToCart", type: 'POST', data:productDetails, dataType:'JSON', });
Trying to retrieve in my Controller:
echo $this->input->post("productDetails");
Outputs Nothing.
Here are my headers:
Remote Address:[::1]:80 Request URL:http://localhost/CI/index.php/user/Add_to_cart/addProductsToCart Request Method:POST Status Code:200 OK Request Headersview source Accept:application/json, text/javascript, */*; q=0.01 Accept-Encoding:gzip, deflate Accept-Language:en-US,en;q=0.8,fr;q=0.6 Connection:keep-alive Content-Length:52 Content-Type:application/x-www-form-urlencoded; charset=UTF-8 Cookie:ci_session=3E5SPro57IrJJkjs2feMNlmMrTqEXrTNN8UyEfleeothNnHwNxuCZDSx4a7cJZGjj7fyr2KLpj%2BPNJeGRSzSPVmcFHVEdhSk4D47ziOl4eZcTUAZlQrWa3EYIeQJVWxMpiGZS26MEfbSXNmfel9e8TcsJTreZHipvfisrJovbXEAW4Uv%2BwrJRep1KCi1MMaDCVJb9UEinRVcDtYe%2F86jhn7kOj4kraVmVzx%2FsOaO0rAxLyAUtez%2Feaa4zBwpN3Td153sAoIb3WxVHoEj2oKyH5prVHigbIhIBR6XZqjBkM6hjBuoD2OSZ2wgLbp9DEENMoqui4WYyHROBuS2DYiJajblcS0KiFga5k%2FQOODvE7p6n%2BozN5ciDliVjJ4PnJ5PD1GaPEmec5%2FbQSlOHYWZk%2F2Blzw3Nw0EtLL7wKDzzQY%3Df645c36bb3548eb8de915b73f8763d97a47783ce Host:localhost Origin:http://localhost Referer:http://localhost/CI/index.php/user/view_available_books/viewAvailableBooks/5 User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36 X-Requested-With:XMLHttpRequest **Form Dataview** sourceview URL encoded id:234 qty:1 price:0.00 name:dasdadsd2q3e!@!@@
My Response which I can See in Developer tools:
Array ( [id] => 234 [qty] => 1 [price] => 0.00 [name] => dasdadsd2q3e!@!@@ )
But in browser, the output is nothing. I am trying to solve it for more than 4 hours now but in vain.
print_r($_POST); // outputs nothing echo $data = file_get_contents('php://input'); //outputs nothing echo $id = $this->input->post('productDetails');// outputs nothing
My View Code:
<script> $('#addtoCart').on('click',function(event){ event.preventDefault(); $(this).attr('disabled',"disabled"); finalprice = $.trim($('#price').val()); finalqty = $.trim($('#quantity').val()); var productDetails = JSON.stringify({'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle}); var base_url = '<?php echo site_url() ?>'; // console.log($); $.ajax({ url: "<?php echo base_url() ?>index.php/user/Add_to_cart/addProductsToCart", type: 'POST', contentType: "application/json; charset=utf-8", data:productDetails, dataType:'html', }); }); </script>
Controller Code:
function addProductsToCart(){ var_dump(json_decode(file_get_contents("php://input"))); print_r($_POST); // $data = json_decode($_POST["productDetails"]); // var_dump($data); // echo $data = file_get_contents('php://input'); // print_r(json_decode($data)); // $id = $this->input->post('id'); // $qty = $this }
-
Abhinav over 9 yearsThat result array is shown only in developer tools when I click the result tab, but not in that page
-
Rana Soyab over 9 yearsprint_r($_POST); you must have written in php correct code ?
-
Rana Soyab over 9 yearsso if $_POST have value then $this->input->post() will also have the same value
-
Abhinav over 9 yearsU r not getting it, I can see the output in developer tools preview tab but cannot retrieve it in that page...I dont know why!! and thts why i have posted this ques!
-
Eli over 9 yearsHow about echoing or putting this data in a table of a view file? How would I do that @AdrienXL? What would be my javascript success: function would look like?
-
logic-unit about 9 yearsWhere's $myobject come from?
-
AdrienXL about 9 years@logic-unit it's the object you've built depending on what you have to do in the
//Stuff
part -
jimasun almost 8 yearsThis is more or less what he did but this answer didn't catch the issue. In the OP's issues
JSON
needs to be fetched usingPOST
. Your answer is opaque because in fact in your codeCI
does NOT processes the request asJSON
.jQuery
modifies the request load into another format in the process! If you need to work withJSON
as the OS stated, check my answer for full explanation. -
Erdinç Çorbacı over 7 years@RanaSoyab the thing is , $_POST is also empty. As jimasun described CI doesnt know how to handle a request which has a application/json content-type.
-
Erdinç Çorbacı over 7 yearsI got no clue... would OP can tell us how this answer helped him/her
-
Deepesh Kumar almost 5 yearsInstead of passing the value through
$this->security->xss_clean()
we can we can use$this->input->input_stream(null, true)
and pass in a second argument astrue
for XSS filtering.