【发布时间】:2010-11-09 15:56:00
【问题描述】:
我想将输入字段中的数据存储到数据库中。但是,当用户决定输入一些反斜杠或引号时,我就搞砸了。
我在客户端使用以下代码。 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
在另一种情况下,当用户使用引号时,我得到 p>
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,该字符串未正确编码和解码。
【问题讨论】: