尝试解析JSON字符串时出现'undefined index'

时间:2012-07-10 14:28:42

标签: php jquery ajax json

我认为存在一些语法错误或概念错误。

我有一个简单的AJAX调用,我将JSON字符串传递给PHP文件。 这就是AJAX调用的样子:

<script> 
  $(document).ready(function () { 
    $("#btn").click(function() { 

      var id = $('#id').val(); 
      var name = $('#name').val(); 
      var Address = $('#Address').val(); 

      $.ajax({ 
        url: "connection.php", 
        type: "POST", 
        data: { topost : "{id':'" + id + "','name':'" + name + "','Address':'" + Address + "'}"}, 
        datatype: "jsonp", 
        success: function (status) { 
          if (status.success == false) { 
            alert("Failure!"); 
          } else { 
            alert("Success!"); 
          } 
        }}); 
     }); 
  }); 
</script> 

这就是我在服务器端PHP文件中解析字符串的方法:

<?php 
  header('Content-type: application/json'); 
  $server = "localhost"; 
  $username = "root"; 
  $password = ""; 
  $database = "jqueryex"; 
  $con = mysql_connect($server, $username, $password); 
  if($con) { echo "Connected to database!"; } 
  else { echo "Could not connect!"; } 
  //or die ("Could not connect: " . mysql_error()); 

  mysql_select_db($database, $con); 
  $thedata= json_decode($_POST['topost']); 
  echo ($thedata); 
  mysql_close($con); 
?> 

我的问题是:

为什么我会在'undefined index topost'的行中出现错误{<1}}:

$thedata= json_decode($_POST['topost']);

我的topost来自我的AJAX,对吗?那么为什么我的PHP中“未定义”呢?

4 个答案:

答案 0 :(得分:1)

我只是飞到这里,这可能不是你的问题,但是当你使用Content-Type:application / json时,PHP不会自动解析体内的json。这样指定的变量不会出现在$ _POST变量中。

你必须自己解析身体,这并不像听起来那么困难。像这样简单的东西会将json体导入_POST变量。这不是最安全的实现,我不建议在没有清理的情况下使用它:

$_POST=array_merge($_POST,json_decode(file_get_contents('php://input'),true));

希望它有所帮助。

答案 1 :(得分:0)

您正在错误地构造data对象,它应该是:

data: {
    "id": id,
    "name": name,
    ... ect
}

您将topost作为字符串传递,而它应该是对象

答案 2 :(得分:0)

两个问题:

  1. 您的报价不匹配(您没有对象的id键的开头报价)
  2. JSON需要双引号"而不是单引号'来引用标识符。
  3. 试试这个:

    data: {
      topost: '{"id":"'+id+'","name":"'+name+'","Address":"'+Address+'"}'
    }, 
    

    或者,您可以使用JSON.stringify()对对象文字进行编码:

    data: {
      topost: JSON.stringify({id: id, name: name, Address: Address})
    }, 
    

    您可以使用Douglas Crockfords JSON2.js library向本机不支持的浏览器提供此功能。

答案 3 :(得分:0)

不确定这是否是导致问题的原因,但您可以改进构建数据对象以进行发送的方式 -

var id = $('#id').val(); 
var name = $('#name').val(); 
var Address = $('#Address').val();

var dataObj = {};
dataObj.id=id;
dataObj.name=name;
dataObj.Address=Address;

$.ajax({ 
  url: "connection.php", 
  type: "POST", 
  data: { 'topost' : dataObj },
  datatype: "jsonp", 
  ...