19

I am using jQuery to post a json object to my php application.

jQuery.post("save.php",JSON.stringify(dataToSend), function(data){ alert(data); });

The json string as pulled from firebug looks like this

{ "data" : [ { "contents" : "This is some content",
        "selector" : "DIV.subhead"
      },
      { "contents" : "some other content",
        "selector" : "LI:nth-child(1) A"
      }
    ],
  "page" : "about_us.php"
}

In php I am trying to turn this into an associative array.

My php code so far is

<?php
$value = json_decode(stripcslashes($_POST));
echo $value['page'];
?>

The response to the ajax call should be "about_us.php" but it comes back blank.

Ryan
  • 26,884
  • 9
  • 56
  • 83
Daniel
  • 407
  • 2
  • 5
  • 10

6 Answers6

90

$_POST will not be populated if the request body is not in the standard urlencoded form.

Instead, read from the read-only php://input stream like this to get the raw request body:

$value = json_decode(file_get_contents('php://input'));
Wolfram
  • 8,044
  • 3
  • 45
  • 66
Evert
  • 93,428
  • 18
  • 118
  • 189
  • is true that it is enough if my POST data wasnot data=value content then I shall use file_get_contents() instead of $_POST ? @Evert? – gumuruh Apr 18 '12 at 09:34
  • It depends on the content-type that's sent. – Evert Apr 18 '12 at 11:02
  • depend on content-type? But in my code i was using content-type of "Content-type", "application/json" and yet... in the Server itself I need to use file_get_contents() instead of $_POST. sigh. – gumuruh Apr 20 '12 at 03:04
  • 8
    Yes, because application/json is not one of the content-types that will populate $_POST. Only application/form-data and application/x-www-form-urlencoded will cause this to be parsed. file_get_contents is actually the best way to do this, the solution the OP ended up using is not as elegant. – Evert Apr 20 '12 at 07:40
  • @Evert $HTTP_RAW_POST_DATA has been depreciated in php 5.6. Now whenever I use `file_get_contents('php://input')'` to process json_encoded data (on my php-scrpt hosted on heroku), it complains about it & want me to set `'always_populate_raw_post_data' to '-1'`. But If I do that It can not populate the data in `$value` . What to do now? – Khurshid Alam Sep 21 '14 at 16:44
16

You can avoid to use JSON.stringify and json_decode:

jQuery.post("save.php", dataToSend, function(data){ alert(data); });

And:

<?php
echo $_POST['page'];
?>

Update:

... but if your really want to use them, then:

jQuery.post("save.php",  {json: JSON.stringify(dataToSend)}, function(data){ alert(data); });

And:

<?php
$value = json_decode($_POST['json']);
echo $value->page;
?>
Francesco Terenzani
  • 1,391
  • 7
  • 14
  • Thank you, Your first method was by far the simplest solution and it worked! I tried the second yesterday and could not get it to work. – Daniel Apr 27 '11 at 16:13
4

Pass the second argument as true if you want the associative array otherwise it will keep returning object.

$value = json_decode(stripslashes($_POST),true);
Shakti Singh
  • 84,385
  • 21
  • 134
  • 153
  • 1
    **Warning**: stripslashes() expects parameter 1 to be string, array given – Mars Robertson Apr 17 '13 at 07:19
  • the stripslashes is great if you are sending multiple post variables and one of them is a json string – Mircea Sandu Sep 21 '15 at 14:46
  • -1; WTF? This will never work under any circumstances ever. `$_POST` is *always* an array, and `stripslashes` will *never* accept an array as an argument. The code you've given is guaranteed to throw a warning and set `$value` to `null`, regardless of the POST body. – Mark Amery Nov 20 '15 at 13:23
1

Try:

echo $value->page;

since json_decode's default behaviour is to return an object of type stdClass.

Alternatively, set the second optional $assoc argument to true:

$value = json_decode(stripslashes($_POST), true);
echo $value['page'];
karim79
  • 339,989
  • 67
  • 413
  • 406
1

It looks like jQuery might encode a javascript object in urlencoded form then would be populated into $_POST. At least from their examples. I'd try passing in your object into post() without stringifying it.

Paul DelRe
  • 4,003
  • 1
  • 24
  • 26
0

If you want to use json data as an associative array, you can try as following:

<?php 

$json = 'json_data'; // json data

$obj = jsondecode($json, true); // decode json as associative array 

// now you can use different values as 
echo $obj['json_string']; // will print page value as 'about_us.php' 


for example: 

$json = { "data" : [ { "contents" : "This is some content",
    "selector" : "DIV.subhead"
   },
   { "contents" : "some other content",
    "selector" : "LI:nth-child(1) A"
   }
  ],
"page" : "about_us.php"
}

$obj = json_decode($json, true); 

/* now to print contents from data */

echo $obj['data']['contents']; 
 // thats all 
?>
Mukesh
  • 1
  • 2