在php键中使用方括号

时间:2016-11-23 22:45:21

标签: javascript php json ajax

我正在尝试使用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,并且我想要处理数据。

我在javascript端尝试了json_encode和解码的整个组合,javascript方面也是JSON.stringify(),尝试使用右括号的转义字符。

但是当我转储$ _POST [“data] [”where]时,值为“J”,键为“name [〜”而不是“name [〜]”。右括号从键上消失。

有人有任何建议吗? 感谢您的帮助,我几个小时都一直在努力......

//编辑:我已经想通了,我放在“]之后的所有东西都从钥匙上消失了。所以密钥从“name [〜] asdf”转换 - > “名称[〜” ...

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我在与JSON.stringify的联结中尝试json_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的开箱即用方法效率低下。

答案 2 :(得分:0)

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

<强> 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_decodephp://input