【问题标题】:Getting Json Form Data in PHP在 PHP 中获取 Json 表单数据
【发布时间】:2012-05-25 13:11:00
【问题描述】:

这似乎是一个不寻常的 json 问题,但我可以向您保证,我找不到我的问题的答案。

在下面的代码示例中,我想获取(可能 decode 正在传输的 json 数据。我已经尝试过 json_decode($_POST)。通过方式请求类型是 POST。无论如何我可以将 json 数据获取到数组或变量中,所以当我想调用 nameage 我会很容易地从请求中检索它们吗?

我正在学习 backbone.js 教程,这是我的模型;

<script type="text/javascript">
        var URL=Backbone.Model.extend({
            initialize: function()
            {
                console.log("URL has been initialized");
            },
            defaults:{
                name:'not defined',
                age:'not defined'
            },
            urlRoot:"/Backbone/manage.php",
            url:function(){
                var base = this.urlRoot || (this.collection && this.collection.url) || "/";
                console.log("Base has been produced");
                if(this.isNew()) return base;

                return base+"?id="+encodeURIComponent(this.id);
            }
        });

        var url=new URL({name:"John",age:10});
        url.save();
    </script>

后来我使用谷歌浏览器来观察网络,我可以清楚地看到数据是作为表单数据传递的。这是 Google 网络工具中的结果;

model:{"name":"John","age":10}

【问题讨论】:

  • 使用print_r($_POST); 来查看哪个字段名称携带有效负载(如果有)。它不仅仅显示为$_POST 的原始数据。可能是json_decode($_POST["varname"])(例如"id",但这是你的问题)或者可能位于php://input

标签: php javascript json backbone.js


【解决方案1】:

如果您将 JSON 有效负载作为原始帖子数据获取,您可以使用以下方式读取它:

json_decode(file_get_contents('php://input'));

如果 php.ini 设置允许填充该变量,您也可以从 $HTTP_RAW_POST_DATA 读取它。

因为你得到的是:

model=%7B%22name%22%3A%22John%22%2C%22age%22%3A10%7D

您不能直接将其解码为 JSON,因为它不是有效的 JSON。

那就试试吧:

parse_str(file_get_contents('php://input'), $post);
$myObject = json_decode($post['model']);

【讨论】:

  • 感谢您的回复。我试过$modelData=json_decode(file_get_contents('php://input')); echo "Name : ".$modelData-&gt;name; 但没用
  • 试试var_dump($modelData); 它可能与您的预期不同。也可以试试var_dump(file_get_contents('php://input')) 看看你有没有得到任何东西
  • 我已经尝试了您所做的最后一次编辑,但它什么也没打印。都尝试了 '$myObject->name' 和 '$myObject[0]->name'
  • 你试过var_dump(file_get_contents('php://input'))吗?如果它没有显示任何内容或为 NULL,则任何进一步的代码甚至都不值得尝试,因为您没有获得任何数据。您是否尝试过在 $HTTP_RAW_POST_DATA 中显示脚本的内容?
  • 现在试过了。它打印: string(52) "model=%7B%22name%22%3A%22John%22%2C%22age%22%3A10%7D"
【解决方案2】:

您需要对 $_POST 数组的 model 键执行 json_decode。 model 键包含您需要解码的 json 字符串。

$modelData = json_decode($_POST['model']);

然后您可以访问$modelData-&gt;name$modelData-&gt;age等数据;

编辑:

尝试将此添加到您的主干设置中:

Backbone.emulateHTTP = true;
Backbone.emulateJSON = true;

这将使您得到application/x-www-form-urlencoded 而不是application/json。这应该会正确填充您的 $_POST 数组。

解释见这里:http://documentcloud.github.com/backbone/docs/backbone.html#section-162

【讨论】:

  • 非常感谢您的想法。这对我来说似乎也很合理,因此我尝试过:$modelData = json_decode($_POST['model']); echo "Name : ".$modelData-&gt;name; 但没有用
  • 你的 $_POST 变量上的 print_r 给你什么?
  • 它打印 1 并且现在我可以得到一个类型 'Array ( [model] => {\"name\":\"John\",\"age\":10} )'使用@Kamil Szot 的解决方案
  • 有趣。我想知道为什么您的 Post 数组没有正确填充。是否使用常规表单帖子正确填充?
  • stackoverflow.com/questions/7530862/…。也许这就是原因。
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
相关资源
最近更新 更多