使用ExtJS编码的字符串JSON可以';不能在PHP中使用json_decode进行解码
我想将输入字段中的数据存储到数据库中。然而,当用户决定输入一些反斜杠或引号时,我就完蛋了 我在客户端使用以下代码。mystring的值实际上是从输入字段读取的使用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
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);