无法将json从客户端发送到php并从php接收json响应

无法将json从客户端发送到php并从php接收json响应,php,jquery,json,ajax,Php,Jquery,Json,Ajax,我正在使用ajax post从jquery发送json对象,我想使用php解析它并将相同的对象发送回来。帖子很成功,所以我的目标是去那里,但我没有得到适当的回应。我正在从html表单发送名字和姓氏,但我在控制台中得到的json对象响应是:- response : [object Object] 当我尝试在浏览器中查看php端时,会出现如下错误:- <br /> <b>Notice</b>: Trying to get property of non-obj

我正在使用ajax post从jquery发送json对象,我想使用php解析它并将相同的对象发送回来。帖子很成功,所以我的目标是去那里,但我没有得到适当的回应。我正在从html表单发送名字和姓氏,但我在控制台中得到的json对象响应是:-

response : [object Object]
当我尝试在浏览器中查看php端时,会出现如下错误:-

<br />
<b>Notice</b>:  Trying to get property of non-object in <b>C:\xampp\htdocs\jsonTest\process.php</b> on line <b>8</b><br />
<br />
<b>Notice</b>:  Trying to get property of non-object in <b>C:\xampp\htdocs\jsonTest\process.php</b> on line <b>9</b><br />
{"firstname":null,"lastname":null}
以下是我正在使用的html表单:

<form id="userDataForm">
        <input type="text" placeholder="Firstname" name="fname" id="fname" />
        <input type="text" placeholder="Lastname" name="lname" id="lname" />
        <input type="submit" value="submit" name="submit">
    </form>

这是php的一部分:-

<?php
    header('Content-type:application/json');
   $request = file_get_contents('php://input');
   $input=json_decode($request);
    $jsonResponse=array(
                'firstname' => $input->fname,
                'lastname'  => $input->lname
                );

    echo json_encode($jsonResponse);

?>


我已经阅读了好几篇stackoverflow文章来说明我的错误,但到目前为止,我还没有看到任何一篇文章,其中json对象是从ajax发送的,也从php接收的。另外,我想知道isset($\u POST)将如何适应这种代码场景,因为我发送的是json对象而不是常规表单数据。

尝试将ajax数据部分更改为:

data: {
   data: JSON.stringify(formData)
},
并使用php接收请求,如下所示:

$request = $_POST['data'];
编辑:经过完整测试的代码

Html:

PHP:


您可以这样做:(
tested

HTML

<form id="userDataForm">
    <input type="text" placeholder="Firstname" name="fname" id="fname" />
    <input type="text" placeholder="Lastname" name="lname" id="lname" />
    <input type="submit" value="submit" name="submit">
</form>
process.php

<?php

    $json_array = json_decode(file_get_contents("php://input"), true);
    $my_array = array();
    foreach($json_array as $key => $value){
        $my_array[$key] = $value;
    }
    echo json_encode($my_array);

?>

因为在您的例子中,您在主体中提交了一个JSON,所以您必须从这个流中读取它。通常的
$\u POST
超全局的方法在这里不起作用

引用PHP手册:

php://input 是一个只读流,允许您从请求主体读取原始数据


解码
$input=json\u decode($request)中的json时必须出错。试试
var\u dump($input):
我很确定您不需要在ajax调用中使用json字符串化数据,也不需要json\u解码数据。因为您将数据类型声明为JSON,所以它同时用于输入和输出。尝试将对象作为数据传递,然后直接作为对象或$request变量中的索引数组或$u POST访问它。这就是我使用ajax/php的方式,它对我来说很好。@RajatBansal那么您的问题与您的示例不同。使用POST时,始终会有一个变量名(至少是我见过的任何名称)。你永远不会只得到一个字符串,你会得到一个数组或对象,有不同的元素或属性,有不同的值。因此,他们可能正在向您发送数据:{info:“jsonencoded string here”}。因此,您需要知道他们发送的变量名,然后在PHP端对该变量运行json_decode。@RajatBansal,直到您从他们那里得到更多澄清,是的,这就是我的建议。让它在不编码或解码请求的情况下处理名字/姓氏的简单表单数据,以确保您设置了流,没有服务器设置问题等。一旦您设置了流,并且确切地知道他们将如何向您发送数据,您可以添加“json_decode”的适当行并因此修改您需要修改的任何变量。@HasseBjörk:当我尝试执行var dump时,会得到“null”。为什么会这样?因为我能够成功发布。你能更具体一点吗,因为当我尝试直接发布时,它在网络下的负载中产生了奇怪的格式“data=%7B%22fname%22%3A%22rajat%22%2C%22lname%22%3A%22bansal%22%7D”,当我用你的请求替换初始$request时,我在php端遇到了另一个错误“
注意:未定义索引:第4行C:\xampp\htdocs\jsonTest\process.php中的数据

“除了最初的两个错误之外,@RajatBansal我已经编辑了我的答案。请尝试复制代码,它在我的服务器和echo的正确值上工作。如果它对您不起作用,这意味着您有一些特殊的服务器配置,但我注意到您没有从php发送JSON响应。因此,在jquery中的代码中,我添加了“dataType:json”,然后创建了一个json数组,而不是回显单个值,如“$jsonResponse=array('firstname'=>$input->fname,'lastname'=>$input->lname);回显json_encode($jsonResponse);”在将其编码为json后,我得到了我想要的东西。你的方式确实起了作用。因此,请进行此编辑,我将接受您的回答。谢谢您提供替代解决方案。但如果你看看我最后一次对上述答案的评论,《超级全球邮报》在这种情况下也发挥了作用。现在我知道了两种方法,谢谢你的回答,不客气我只是想说明,即使您使用ajax请求发送JSON对象,您仍然可以使用只读流处理它。
  $('#userDataForm').submit(function(e){
         e.preventDefault();
         var formData={
            fname:$('#fname').val(),
            lname:$('#lname').val()
         };
         jQuery.ajax({
            type: 'POST',
            url: 'process.php',
            dataType: 'json',
            data: {
               data: JSON.stringify(formData)
            },
            success: function(res) {
               alert(res);
            }
         });
      });
  if (isset($_POST['data'])) {
      $request = $_POST['data'];
      $input = json_decode($request);
      $jsonResponse = array(
            'firstname' => $input->fname,
            'lastname'  => $input->lname
      );
      echo json_encode($jsonResponse);
   }
<form id="userDataForm">
    <input type="text" placeholder="Firstname" name="fname" id="fname" />
    <input type="text" placeholder="Lastname" name="lname" id="lname" />
    <input type="submit" value="submit" name="submit">
</form>
    $(document).ready(function(){
        $("#userDataForm").submit(function(e){
            e.preventDefault();
            var formData={
                fname:$("#fname").val(),
                lname:$("#lname").val()
            };
            $.ajax({
                type:'post',
                url:'process.php',
                dataType:'json',
                data:JSON.stringify(formData),
                contentType: "application/json",

                success:function(response){ 
                    // process json object
                    console.log(response.fname);
                    console.log(response.lname);
                },
                error: function(jqXHR, textStatus, errorThrown){
                    alert(errorThrown);
                }
            });
        });
    });
<?php

    $json_array = json_decode(file_get_contents("php://input"), true);
    $my_array = array();
    foreach($json_array as $key => $value){
        $my_array[$key] = $value;
    }
    echo json_encode($my_array);

?>