8

php://input is working properly in localhost. But in server it returns empty. Input( request ) to my site is a json(REST - application/json type), so $_POST didn't work ( please read This question ) .

$_POST works with key-value pair type inputs like form-data or x-www-urlencoded

key1=value1&key2=value2&key3=value3

I'm using application/json as input (in REST).

Like {'key1':'value1','key2':'value2','key3':'value3'}

This can't be handled using $_POST. But using php://input can help to read that data.

My code

class Webservice_Controller extends CI_Controller {
    public $json_input_data;
    public function __construct(){
        parent::__construct();
        $this->json_input_data = json_decode(file_get_contents('php://input'),TRUE);
    }
    public function json_input($label){
        if(isset($this->json_input_data[$label])) return $this->json_input_data[$label];
        else return NULL;
    }
}

Above code is works fine in another webserver also, But not in the current one. :(

I think my web server deny access to php://input.

Is there is any other methods to read json input in php ?

Community
  • 1
  • 1
Arjun Raj
  • 984
  • 2
  • 12
  • 32
  • first things to check, is the php versions the same, and if `allow_fopen_url` is set – DevZer0 Aug 22 '13 at 04:35
  • Try `var_dump($this->json_input_data )` in `__construct()` – Rohan Kumar Aug 22 '13 at 04:39
  • @RohanKumar -> it prints "NULL" in server i hosted. Prints "array(2) { ["id"]=> string(2) "79" ["t"]=> string(5) "22_00" }" in localhost. – Arjun Raj Aug 22 '13 at 07:44
  • @DevZer0 PHP version is 5.3 and it supports. I didn't find an option to access php.ini file in my control panel ( it's a shared server ). Is there any method to test that ? Plz help.. – Arjun Raj Aug 22 '13 at 07:51

2 Answers2

4

php://input is a read-only stream that allows you to read raw data from the request body. In the case of POST requests, it is preferable to use php://input instead of $HTTP_RAW_POST_DATA as it does not depend on special php.ini directives. Moreover, for those cases where $HTTP_RAW_POST_DATA is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data. php://input is not available with enctype="multipart/form-data".

See wrappers

Try this too,

....
  public function __construct(){
    parent::__construct();
    if(isset($_POST))
    {
       var_dump(file_get_contents('php://input'));
       $this->json_input_data=json_decode(file_get_contents('php://input'),TRUE);
    }
    else echo 'Not Post';
  }
....

Also check for allow_url_fopen.

Rohan Kumar
  • 40,431
  • 11
  • 76
  • 106
  • I saw the wrappers, and also the input isn't enctype="multipart/form-data". It works fine in localhost, but the web server i used to host returns null while i using php://input. May be it denay access to that. I want to know is it possible to do in any other methods ??? – Arjun Raj Aug 22 '13 at 07:39
  • it gives "NULL" in server i hosted. Prints "array(2) { ["id"]=> string(2) "79" ["t"]=> string(5) "22_00" }" in localhost. It's mentioned in comments of the question. I think 'php://input' is not accessible in that web server. – Arjun Raj Aug 22 '13 at 08:02
4

I know this is old, but it might help others:

Careful with single quotes inside your json

From the PHP documentation about json_decode:

the name and value must be enclosed in double quotes
single quotes are not valid 

$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null
matpb
  • 476
  • 4
  • 11