Php ';未定义索引';尝试解析JSON字符串时

Php ';未定义索引';尝试解析JSON字符串时,php,jquery,ajax,json,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

我认为有一些语法错误或概念错误

我有一个简单的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> 

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

您的
数据结构不正确,它应该是:

data: {
    "id": id,
    "name": name,
    ... ect
}
您正在将
topost
作为字符串传递,而它应该是一个对象

有两个问题:

  • 您的引号不匹配(您没有对象的
    id
    键的起始引号)
  • JSON需要双引号
    而不是单引号
    来引用标识符
  • 试试这个:

    data: {
      topost: '{"id":"'+id+'","name":"'+name+'","Address":"'+Address+'"}'
    }, 
    
    或者,您可以使用对对象文字进行编码:

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

    您可以使用Douglas Crockfords为本机不支持此功能的浏览器提供此功能。

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

    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", 
      ...
    

    我只是飞过这里,这可能根本不是您的问题,但是当您使用内容类型:application/json时,PHP不会自动解析正文中的json。这样指定的变量不会显示在$\u POST变量中

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

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

    希望有帮助。

    错误是否比“未定义的符号”更具体?错误是
    未定义的符号
    。如果问题是存在
    $\u POST['topost']
    ,则错误将读取-未定义索引“topost”“是的,对不起,这就是错误所在。我现在编辑了我的问题,我在我的谷歌浏览器控制台上看到,点击提交按钮,我得到一个错误:选项file:///C:/workspace/Settling/assets/www/connection.php 资源加载失败为什么会这样?位于本地主机上的php文件。如何告诉ajax我的connection.php在哪里?您需要给出
    connection.php
    文件的路径。如果您的文件位于文件夹中,而不是web根目录中,那么您可以为其提供如下路径-
    /folder\u NAME/connection.php
    。注意第一个
    /
    -这表示路径是相对于您的web根目录的。他以JSON字符串的形式发送一个post参数(他也可以用您的方式发送,可能会更简单),但这并不意味着他所做的是错误的。我在我的google chrome控制台中看到,单击提交按钮时,我得到一个错误:选项file:///C:/workspace/Settling/assets/www/connection.php 资源加载失败为什么会这样?位于本地主机上的php文件。如何告诉ajax我的connection.php在哪里?我在google chrome控制台中看到,单击submit按钮时出现错误:OPTIONSfile:///C:/workspace/Settling/assets/www/connection.php 资源加载失败为什么会这样?位于本地主机上的php文件。如何告诉ajax我的connection.php在哪里?
    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", 
      ...
    
    $_POST=array_merge($_POST,json_decode(file_get_contents('php://input'),true));