3

I'm trying to pass a JavaScript object to a PHP script through jquery.ajax(), basically:

var bigArray = new Object();
//Dode
//Start loop
bigArray[x] = {name: exname, id: exID, order:e, set: setBox, inc: incBox, example: exampleBox, day: i};

So it's pretty much an array of these objects.

    var anotherTest = $.toJSON(bigArray);
    var ajxFile = "routineajax.php";
    $.ajax({
        type: 'POST',
        processData: false,
        url: ajxFile,
        data: anotherTest,
        success: function(data) {
            $('#result').html(data);
            alert('Load was performed.');
        }
    });
});

The PHP side script

 print_r($_POST);
 $params = json_decode($_POST);
 print_r($params)

The Ajax call is going through, and I can see in Firebug, but print_r($_POST) is returning an empty array. While if I change it to $_GET in both the $.ajax function and PHP script it works. My main problem is I'm getting this error message:

Warning: json_decode() expects parameter 1 to be string, array given in

How do I fix this problem?


After adding this snippet to the PHP file

  $data = file_get_contents('php://input');
  var_dump($data);
  var_dump(json_decode($data));

I'm getting this output

string'{"0"{"name":"Decline`Abs","id":"54","order":0,"set":"","inc":"","example":"","day":1}}' (length=87)`
  object(stdClass)[2]
      public '0' =>
        object(stdClass)[4]
          public 'name' => string 'Decline Abs' (length=11)
          public 'id' => string '54' (length=2)
          public 'order' => int 0
          public 'set' => string '' (length=0)
          public 'inc' => string '' (length=0)
          public 'example' => string '' (length=0)
          public 'day' => int 1

So at least it's going through, I'm not sure how to access it though, a step in the right direction!

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
mike
  • 1,296
  • 3
  • 16
  • 24
  • Can you edit your question with the results of doing print_r($_GET). I see you have it below, but it's unclear to me. – davidtbernal Mar 05 '10 at 00:15

3 Answers3

3

I think the problem is that normally POST data is sent encoded as key=value&key2=value2, and you're sending it as JSON. Try accessing the raw post data as follows:

$data = file_get_contents('php://input');
var_dump($data);
var_dump(json_decode($data));

and see if that works. If not, please post in your question what it returns, if anything.


Based on the comment below and additions to the OP.

Did the var_dump of $data copy-paste correctly? The reason I ask is that this: string'{"0"{"name" does not look right to me. That isn't valid JSON or a properly encoded POST string. It might be that some of the characters got encoded when you copied and pasted.

Either way, you're now getting the result you need. The stdClass is just a blank container that it puts the data into, which you can access using the normal object syntax. In this case, you'd have to do $data->{0}->name I think, because of that 0. If you do $data = json_decode($data, true) it will be an associative array, and you can access the POST'ed data as $data[0]['name'].

If you want to keep exploring this, it might be helpful to show the results of doing window.console.dir(data) right before you do the ajax request, and make sure when you var_dump(data), you view the source of the page to copy and paste. window.console.dir(data) will show data's properties in the Firebug window (you are using Firebug, right?). It also works in Chrome's debugger, and maybe others as well. Like I said though, it looks like you're probably getting what you need already, so investigating isn't necessary.

davidtbernal
  • 12,404
  • 9
  • 41
  • 58
  • I added the output in the OP. It seems to be moving in the right direction now. Can you explain whats going on though? – mike Mar 05 '10 at 05:45
  • SO question about stdclass, in case you're unfamiliar with it: http://stackoverflow.com/questions/931407 – davidtbernal Mar 05 '10 at 22:39
0

Isn't it clear enough? json_decode() expects parameter one to be string, not array. But $_POST and $_GET are always arrays. You can pass a member of this array to json_decode().

To see an array's contents, use this snippet:

echo "<pre>";
print_r($_GET);
echo "</pre>";
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Your Common Sense
  • 152,517
  • 33
  • 193
  • 313
  • I think the problem is with toJSON since this is the $_GET output I'm getting: Array ( [{"0":{"name":"Bent_Over_Rows","id":"27","order":0,"set":"","inc":"","example":"","day":1}}] => ) Instead of 0 => elements. But at least the array error is gone... – mike Mar 03 '10 at 21:46
0

Turn processData to true. I don't believe your JSON is being passed through correctly. Also note that it won't come through as a json, but rather the key value pairs of your JSON will be the contents of $_POST when you get to it.

Also, are the values of your bigArray easily convertable to string? If you're passing in DOM elements or something, you're going to have issues.

Brent
  • 21,918
  • 10
  • 42
  • 49
  • Turned on processData, and still the PHP isn't picking up the $_POST. I know it's going through because I see it in firebug here: Parametersapplication/x-www-form-urlencoded {"0":{"name":"Decline Abs... Only $_GET has been going through.. – mike Mar 03 '10 at 22:54
  • Try not converting bigArray to a JSON at all. jQuery.ajax() expects an object for the data parameter anyway: http://api.jquery.com/jQuery.ajax/ – Brent Mar 04 '10 at 00:49
  • Sending bigArray through POST gives me this Array ( [0] => [object Object] [1] => [object Object] ) So seems like it didnt pass the object through. – mike Mar 04 '10 at 02:26