使用ExtJS编码的字符串JSON可以';不能在PHP中使用json_decode进行解码

使用ExtJS编码的字符串JSON可以';不能在PHP中使用json_decode进行解码,php,json,extjs,Php,Json,Extjs,我想将输入字段中的数据存储到数据库中。然而,当用户决定输入一些反斜杠或引号时,我就完蛋了 我在客户端使用以下代码。mystring的值实际上是从输入字段读取的 mydata = Ext.encode({ mystring : "foo '\' bar ' \0x00\"" }); Ext.Ajax.request({ url: '/test.php', params: { data: mydata } }); 在服务器上,print\r($\u POST)为我提供 array

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

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

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

Ext.Ajax.request({
  url: '/test.php',
  params: { data: mydata }
});
在服务器上,
print\r($\u POST)
为我提供

array(
  ['data'] => '{"mystring":"foo '' bar ' \u0000x00\""}'
)
因此,我丢失了foo后面的反斜杠,
\0x
变成了
\u00
,并且

var_dump(json_decode($_POST['data'])
失败并返回

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

mydata = Ext.encode({
    {"mystring":"foo '\"' bar '"}
});
最后,我在PHP端发布了
$\u POST

array(
  ['data'] => '{"mystring":"foo '"' bar '"}'
)
对于json_decode(),这也是无效的输入

我希望用户输入字面意思。我想让我的数据库包装器在INSERT命令之前处理转义内容,但是如何才能将任意字符串(可能包含任意数量的斜杠、反斜杠、双引号和单引号)安全地发送到我的PHP脚本并成功地对其进行json_解码

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

有关文档,请参阅


编辑:

数据从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)中输入双引号时,字符串的编码和解码不正确。

您是说“mystring”的值是从输入字段读取的,在这种情况下,它应该工作,但在您的示例中,您粘贴了字符串,但其中有未转义的反斜杠,因此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\\\""
"foo '\\' bar ' \\0x00\\\""
"foo '' bar ' \u0000x00\""
"foo '' bar ' \u0000x00\""

希望这有帮助

当您获得POST数据时,通过斜杠运行它

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

谢谢你的回复。确切地说,mystring的值不是直接从输入字段读取的,而是从可编辑的网格读取的。我相应地更新了原始问题。可能重复
$grid_data = json_decode ( stripslashes ( $_POST['grid_data'] ), true);