使用ExtJS编码的字符串JSON无法使用PHP中的json_decode进行解码

时间:2010-11-09 15:56:00

标签: php json extjs

我想将输入字段中的数据存储到数据库中。但是,当用户决定输入一些反斜杠或引号时,我就搞砸了。

我在客户端使用以下代码。事实上,mystring的值是从输入字段读取的。

mydata = Ext.encode({
    mystring : "foo '\' bar ' \0x00\""
});

Ext.Ajax.request({
  url: '/test.php',
  params: { data: mydata }
});

在服务器上,print_r($_POST)给了我

array(
  ['data'] => '{"mystring":"foo '' bar ' \u0000x00\""}'
)

所以,我在foo之后丢失了反斜杠,而\0x变成了\u00,并且

var_dump(json_decode($_POST['data'])

失败并返回

NULL

在另一种情况下,当用户使用引号时,我得到

mydata = Ext.encode({
    {"mystring":"foo '\"' bar '"}
});

我最终在PHP端使用$_POST

array(
  ['data'] => '{"mystring":"foo '"' bar '"}'
)

这也不是json_decode()的有效输入。

我希望字面上的用户输入。我想让我的数据库包装器在INSERT命令之前处理转义的东西,但我怎样才能发送任意字符串,可能包含任意数量的斜杠,反斜杠,双引号和单引号安全地到我的PHP脚本并且json_decode成功?

我已经考虑过base64编码,但这不是一个很好的选择。

有关文档,请参阅http://dev.sencha.com/deploy/dev/docs/?class=Ext.util.JSON


修改

从Ext.grid.EditorGridPanel myGrid的商店中读取数据。整个脚本有大约2.500 LoC,所以我只在这里发布一个摘录。我还更改了一些变量名称,使整个内容更具可读性。

var modRec = myGrid.getStore().getModifiedRecords();
var data = new Array();
var len = modRec.length - 1;
for (f = len; f > -1; --f) {
    var a = {};
    var changes = modRec[f].getChanges();
    for (var name in changes) {
        if ('function' == typeof changes[name]) {
            continue;
        }
        a[name] = changes[name];
    }
    data.push(a);
}

Ext.Ajax.request({
    url: '/test.php',
    params: { Ext.encode(data) }
});

结果与上述相同。当用户在网格单元格编辑器的编辑器字段(即Ext.form.TextField)中输入双引号时,字符串不会被正确编码和解码。

2 个答案:

答案 0 :(得分:2)

获取POST数据后,请通过stripslashes运行。

$grid_data = json_decode ( stripslashes ( $_POST['grid_data'] ), true);

答案 1 :(得分:0)

你说'mystring'的值是从输入字段中读取的,o在这种情况下它应该可以工作,但是在你的例子中你粘贴了字符串,但是你有未转义的反斜杠,所以JavaScript转义了下面的字符

Ext.encode(或JSON本机对象)在读取用户输入的字符串时正常工作:

使用以下HTML代码:

<html>
<head>
<title>Test Page</title>
<script src="https://www.google.com/jsapi"></script>
<script>
google.load('jquery','1');
google.load("ext-core", "3.1.0");
</script>
</head>
<body>
<input type="text" id="test" />
</body>
</html>

在框中手动输入此确切字符串:foo '\' bar ' \0x00\"

然后从控制台运行以下javascript代码,您将看到前两个日志显示预期的JSON输出,第二个虽然技术上很好,但在代码处理之前,它已经从javascript引擎解析了字符串:

var x = $('#test').val();
console.log(JSON.stringify(x));
console.log(Ext.encode(x));

var y = "foo '\' bar ' \0x00\""
console.log(JSON.stringify(y));
console.log(Ext.encode(y));

您应该得到以下结果:

"foo '\\' bar ' \\0x00\\\""
"foo '\\' bar ' \\0x00\\\""
"foo '' bar ' \u0000x00\""
"foo '' bar ' \u0000x00\""

希望这有帮助!