lampwins
lampwins

Reputation: 920

JSON error(s) with php backend

I've never worked with JSON before and it's not going well...

I have a PHP script that returns a JSON array(is that the correct term?) The script returns: {"items":1000,"mitems":0,"donations":0,"total":1000}

NOTE: The script also sets the Content-Type to application/json

Here is my front-end javascript to handle that response:

function ajax(){
    $.ajax({
         url: '../ajax/goal_ajax.php',
         dataType: 'json',
         success: function( data ){
          // success! :D
          alert('success');
         }, error: function( data ){
          // data.responseText is what you want to display, that's your error.
          alert(data.responseText);
         }
    })
    //progressBar.set('value',data.total);
    //document.getElementById('txtCDInfo').innerHTML=txt;
} 

When that function is called I get an alert with the following message: {"items":1000,"mitems":0,"donations":0,"total":1000}

If everything was successful, I should get an alert that says success, right?

Can someone please tell me what is going on here?

Thank you!

Upvotes: 1

Views: 787

Answers (4)

Jon
Jon

Reputation: 1314

It could be that your PHP script returns an error status code and even though it prints out the correct result, it still fails. I tested your scripts on my system and I got the 'success' alert. Then I changed my PHP script to the following:

<?php
header('Content-type: application/json', true, 401); 
echo '{"items":1000,"mitems":0,"donations":0,"total":1000}';
?>

Note that the third parameter of the header function sets the http response code to 401 - Even though the correct output is sent back to the client; officially, the request has failed because of that status code. After running this code, I got the exact same problem as you.

So in summary, there might be something in your script which is causing a non-fatal error which doesn't show in the output of the script.

Upvotes: 2

Daniel O&#39;Leary
Daniel O&#39;Leary

Reputation: 191

As the guy above me said, you should be using the json_encode(); function in PHP then echo'ing that output. Make sure you encode an array though:

    <?
      $send = array(
                  'items' => '1000',
                  'mitems' => '0', 
                  'donations' => '0', 
                  'total' => '1000',
                );

      echo json_encode($send);
    ?>

Upvotes: 0

Dmitri Bouianov
Dmitri Bouianov

Reputation: 538

Are you defining the MIME type in your HTTP response?

Try adding a Content-type header to the output of your script.

<?php
...
    $output = json_encode(...);
    header('Content-type: application/json');
    echo $output;
...
?>

You can also try using the mimeType parameter in your $.ajax() call to override the response type.

http://api.jquery.com/jQuery.ajax

Are you running your PHP scripts under Apache or on their own (chmod u+x on the script)? You probably need to use a PHP framework such as Zend, CodeIgniter or CakePHP and define a controller action that handles your AJAX request to have a proper HTTP response.

Upvotes: 0

Abe Petrillo
Abe Petrillo

Reputation: 2447

This is the least documented thing in jquery what you need to do is alert the actual error in order to debug it. so do the following:

function my_ajax(){
    $.ajax({
         url: '/ajax/goal_ajax.php',
         dataType: 'json',
         success: function( data ){
          // success! :D
          alert('success');
         }, error: function(jqXHR, textStatus, errorThrown){
          // data.responseText is what you want to display, that's your error.
          alert(jqXHR+","+textStatus+","+errorThrown);
         }
    })
    //progressBar.set('value',data.total);
    //document.getElementById('txtCDInfo').innerHTML=txt;
} 

So two things I've done:

Change the name of the function (ajax is kinda a bad name :S) and improved the error reporting.

You should be getting the alert "success" yes. So something is going wrong.

EDIT:

Just noticed another thing, I dont think "../" would be a great way to reference the url, usually its either "/foo/ajax" which will allow you to use this function on any page.

Upvotes: 3

Related Questions