使用jQuery AJAX调用返回JSON的PHP脚本

40

我一直在为这个问题苦恼,尝试了stackoverflow上的许多解决方案,但找不到一个可行的!

基本上,当我使用AJAX POST时,PHP返回JSON,但AJAX显示Undefined而不是值:

JS:

Original Answer翻译成:最初的回答:

  /* attach a submit handler to the form */
  $("#group").submit(function(event) {

  /* stop form from submitting normally */
  event.preventDefault();

  /*clear result div*/
  $("#result").html('');

  /* get some values from elements on the page: */
  var val = $(this).serialize();

  /* Send the data using post and put the results in a div */
  $.ajax({
      url: "inc/group.ajax.php",
      type: "post",
      data: val,
  datatype: 'json',
      success: function(data){
            $('#result').html(data.status +':' + data.message);   
            $("#result").addClass('msg_notice');
            $("#result").fadeIn(1500);           
      },
      error:function(){
          $("#result").html('There was an error updating the settings');
          $("#result").addClass('msg_error');
          $("#result").fadeIn(1500);
      }   
    }); 
});

PHP:

  $db = new DbConnector();
  $db->connect();
  $sql='SELECT grp.group_id, group_name, group_enabled, COUNT('.USER_TBL.'.id) AS users, grp.created, grp.updated '
        .'FROM '.GROUP_TBL.' grp '
        .'LEFT JOIN members USING(group_id) '
        .'WHERE grp.group_id ='.$group_id.' GROUP BY grp.group_id';

    $result = $db->query($sql);     
    $row = mysql_fetch_array($result);
    $users = $row['users'];
    if(!$users == '0'){
        $return["json"] = json_encode($return);
        echo json_encode(array('status' => 'error','message'=> 'There are users in this group'));
    }else{

        $sql2= 'DELETE FROM '.GROUP_TBL.' WHERE group_id='.$group_id.'';
        $result = $db->query($sql2);

        if(!$result){
            echo json_encode(array('status' => 'error','message'=> 'The group has not been removed'));
        }else{
            echo json_encode(array('status' => 'success','message'=> 'The group has been removed'));
        }
    }

Firebug中的JSON结果:

最初的回答:
{"status":"success","message":"success message"}

AJAX将JSON结果显示为未定义,我不知道为什么。我尝试添加dataType='json'datatype='json'来显示,也尝试将其更改为data.statusdata['status']:但仍然无法解决问题。
非常感谢任何帮助。
最初的回答:AJAX返回的数据格式可能不是有效的JSON格式,或者在处理数据时出现了错误。您可以使用浏览器的开发工具检查响应并查看是否存在任何错误消息。此外,请确保服务器正确设置了Content-Type标头以指示返回的内容类型为JSON。

3
设置一个"application/json"的头信息,代码为header('Content-Type: application/json'); - hank
4
datatype 应该大写 TdataType: 'json'。理论上它应该从响应中推断出类型,因此这可能无法解决问题。 - Rory McCrossan
要么使用 @hank 的建议,要么使用 @Rory 的建议都足够了。如果正确的 mimetype 被设置了,就不需要指定 dataType - Johan
5个回答

48

将其更正为dataType而非datatype

并在PHP中添加以下代码,因为您的Ajax请求期望JSON,而不会接受其他任何内容。

header('Content-Type: application/json');

JSON和JSONP的正确内容类型

Firebug中可见的响应是文本数据。检查响应头的Content-Type以验证响应是否为JSON。如果响应为JSON,则应为application/json,而对于dataType:'html'应为text/html


谢谢!大多数帖子都说header('Content-Type: application/json');不是必需的,但显然它是必需的! - Steven Marks
如果这对你有所帮助,我会非常高兴。当像这样的事情不起作用时,我知道它是什么感觉。是的,我过去也曾因为不同的服务器端语言而撞墙 :D - Sorter
我有一个脚本仍然无法正常工作,我正在从表中删除一行,然后返回json,但是json似乎在其前面具有已删除行的ID:38 {"status":“success”,“message”:“该组已被删除”} - Steven Marks
你需要打印并查看 PHP 发送的内容,然后进行相应的修复。 - Sorter
这是我的问题的解决方案。 - AdRock

5

我建议您使用:

var returnedData = JSON.parse(data);

将JSON字符串(如果仅为文本)转换为JavaScript对象。


如果您使用成功回调函数,那么您已经将结果字符串解析为JavaScript对象并将其作为参数放入成功回调函数中。 - Simon Polak

3
使用parseJSON jQuery方法将字符串转换为对象。
var objData = jQuery.parseJSON(data);

现在您可以编写代码。
$('#result').html(objData .status +':' + objData .message);

2

您的数据类型错误,请将 dataType 的数据类型更改为正确的类型。


2
尝试在服务器端发送内容类型标头,在回显之前使用以下代码:

尝试在服务器端发送内容类型标头,在回显之前使用以下代码:

header('Content-Type: application/json');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接