【问题标题】:String JSON-encoded with ExtJS can't be decoded with json_decode in PHP使用 ExtJS 编码的字符串 JSON 无法在 PHP 中使用 json_decode 进行解码
【发布时间】: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,该字符串未正确编码和解码。

【问题讨论】:

标签: php json extjs


【解决方案1】:

当你得到你的 POST 数据时,通过stripslashes 运行它。

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

【讨论】:

    【解决方案2】:

    您是说“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\"

    然后从控制台运行以下 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\""
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回复。确切地说,mystring 的值不是直接从输入字段中读取的,而是从可编辑的网格中读取的。我相应地更新了原始问题。
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 2013-08-18
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-04-24
    相关资源
    最近更新 更多