【问题标题】:Using square right bracket in php key在 php 键中使用方括号
【发布时间】:2016-11-23 22:45:21
【问题描述】:

我正在尝试使用 ajax 发布字典。但是我遇到了一些关于 json 和 "]" 字符的问题。

这是我的代码示例(javascript):

var dict = {"id":"patient","where":{"name[~]":"J"}};
$.post("./ajax.php",{data:dict},function(data){
});

还有 ajax.php(这个文件只处理 $_POST 数组中的 json 编码数据):

$where = $_POST["data"]["where"];

基本上我正在尝试将 json 格式的消息发送到 php,我想在那里处理数据。

我在 php 端尝试了与 json_encode 和 decode 的全部组合,在 javascript 端也尝试了 JSON.stringify(),尝试使用右括号的转义字符。

但是当我转储 $_POST["data]["where] 时,值 "J" 的键为 "name[~" 而不是 "name[~]"。右括号从键中消失。

请问有人给点建议吗? 感谢您的帮助,我已经为此苦苦挣扎了好几个小时...

//编辑:我发现,我在“]”之后放置的所有内容都会从键中消失。所以键从 "name[~]asdf" -> "name[~"...

【问题讨论】:

  • 您尝试发送数据的方式,您将始终看到一个键值结果,我建议您将您的方法更改为var dict = {"id":"patient","where":"name[~]:J"}};,然后在服务器端explode(':', $_POST["data"]["where"]);
  • @sand 感谢您的回复。这是个好主意,但如果我想发送一个“:”字符作为值怎么办?还是更多?如果有“:”作为值,分隔符 : 将不起作用。示例{"where":"name[~]:Jmkl:"} - 这将导致这种方法出错。我正在考虑最通用的方法。
  • @sand 这无助于找到原因,只是抹去了问题。 OP正在做某事。我用不同的变体测试了这段代码,OP是正确的。

标签: javascript php json ajax


【解决方案1】:

当您向 jQuery AJAX 函数提供对象时,它会对其进行 URL 编码。 jQuery 将data.where 参数发送为:

data[where][name[~]]=J

而 PHP 显然不能处理这样的嵌套括号;它只是将name 之前的[ 与下一个] 匹配。

可能 jQuery 需要对这个属性名进行双重编码来保护它,但显然不需要。

解决方法是将dict 编码为 JSON,并在 PHP 中对其进行解码。 JS:

$.post("./ajax.php",{data: JSON.stringify(dict)},function(data){

PHP:

$data = json_decode($_POST['data'], true);
$where = $data['where'];
var_dump($where);

【讨论】:

  • 感谢您的回答。但是,我仍然无法使其工作,在发布问题之前我已经尝试过了。 json_decode 的输出为空字符串/""。但是 $_POST["data"] 存在。我不知道我做错了什么。
  • 我刚试了一下,效果很好。见dev.bridgebase.com/barmar_test/test1.html
  • 好的,我明白了,那么其他地方肯定有问题。因为当我运行你的代码时,我从 var_dump() 得到 NULL。也许不同版本的php?因为 json_decode 的输入是正确的,但函数返回 NULL。我正在使用 php 版本 5.6.25。
  • 您的数据中是否有任何 Unicode 字符?也许这会导致其他问题。我只是复制并粘贴了您的var dict 行。
  • 不,我正在使用与您相同的字典。根据手册返回4JSON_ERROR_SYNTAX
【解决方案2】:

我已尝试将JSON.stringifyjson_decode 结合使用,结果看起来不错:

JS

$.ajax({
        url: './ajax.php',
        method: 'post',
        data: "data="+JSON.stringify(dict)
    });

PHP

json_decode($_POST['data'], true);

我认为您应该指定 JSON 是关联的,将 $assoc 参数设置为 true。见this

您也可以将数据作为 JSON(而非字符串)发送,然后使用 php://input 流读取原始帖子数据,并使用 json_decode 并将 $assoc 设置为 true 自己检索到的数据;因为编译到 PHP 中的开箱即用方法似乎效率低下。

【讨论】:

  • 不应该是"data="+encodeURIComponent(JSON.stringify(dict))吗?
  • 谢谢,但@Barmar 的答案似乎存在同样的问题,解码返回 NULL。
【解决方案3】:

另一个对我有用的解决方案:

JS

$.ajax({
        url: 'recAjax.php',
        method: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(dict)
    });

PHP

var_dump(json_decode(file_get_contents('php://input'), true));

json_decode, php://input

【讨论】:

  • //编辑:这行得通!非常感谢!但我也很好奇为什么第二种方法不起作用:)。
  • 实际上,第二个对我有用;但话又说回来,我使用 PHP v7.0.9
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多