我想将输入字段中的数据存储到数据库中。但是,当用户决定输入一些反斜杠或引号时,我就搞砸了。
我在客户端使用以下代码。事实上,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)中输入双引号时,字符串不会被正确编码和解码。
答案 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\""
希望这有帮助!