【问题标题】:Stop PHP escaping JSON string when writing to file写入文件时停止 PHP 转义 JSON 字符串
【发布时间】:2011-09-14 18:38:26
【问题描述】:

我正在尝试使用 JQuery 和 PHP 将更改保存到 JSON 文件,但似乎我的 PHP 脚本在保存 JSON 时正在转义字符,这意味着我无法再次将其读回。

我使用以下代码将 JSON 对象('family')传递给 save.php:

function saveChanges() {
    $.ajax({
        type: "POST",
         url: "save.php",
         data: {
            data: JSON.stringify(family)
         },


         success: function(msg){
             console.log(data);
   }
 });
    }

然后save.php将JSON数据写入armstrong.json,代码如下

<?php

$data = $_POST["data"];
echo $data;
$filename = 'armstrong.json';

if (is_writable($filename)) {
    if (!$handle = fopen($filename, "w")) {
         echo "Cannot open file ($filename)";
         exit;
    }

    if (fwrite($handle, parse_json($data)) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }
echo "Success, wrote ($data) to file ($filename)";

fclose($handle);

} else {
    echo "The file $filename is not writable";
}

?>

但是文件被写出如下:

{\"title\":\"Armstrong\",\"description\":\"The Armstrong Family\",\"patriarchID\":\"id1\",\"latestID\":8,\"members\":[{\"name\":\"Grandad\",\"id\":\"id1\",\"children\":[\"id2\",\"id3\"]},{\"name\":\"Dad\",\"id\":\"id2\",\"children\":[\"id4\",\"id5\",\"id6\",\"id7\"]},{\"name\":\"Uncle\",\"id\":\"id3\"},{\"name\":\"Child\",\"id\":\"id4\"},{\"name\":\"Child\",\"id\":\"id5\"},{\"name\":\"Child\",\"id\":\"id6\"},{\"name\":\"Child\",\"id\":\"id7\"},{\"name\":\"a\",\"id\":\"id8\"}]}{\"title\":\"Armstrong\",\"description\":\"The Armstrong Family\",\"patriarchID\":\"id1\",\"latestID\":9,\"members\":[{\"name\":\"Grandad\",\"id\":\"id1\",\"children\":[\"id2\",\"id3\"]},{\"name\":\"Dad\",\"id\":\"id2\",\"children\":[\"id4\",\"id5\",\"id6\",\"id7\"]},{\"name\":\"Uncle\",\"id\":\"id3\"},{\"name\":\"Child\",\"id\":\"id4\"},{\"name\":\"Child\",\"id\":\"id5\"},{\"name\":\"Child\",\"id\":\"id6\"},{\"name\":\"Child\",\"id\":\"id7\"},{\"name\":\"a\",\"id\":\"id8\"},{\"name\":\"a\",\"id\":\"id9\"}]}{\"title\":\"Armstrong\",\"description\":\"The Armstrong Family\",\"patriarchID\":\"id1\",\"latestID\":10,\"members\":[{\"name\":\"Grandad\",\"id\":\"id1\",\"children\":[\"id2\",\"id3\"]},{\"name\":\"Dad\",\"id\":\"id2\",\"children\":[\"id4\",\"id5\",\"id6\",\"id7\"]},{\"name\":\"Uncle\",\"id\":\"id3\"},{\"name\":\"Child\",\"id\":\"id4\"},{\"name\":\"Child\",\"id\":\"id5\"},{\"name\":\"Child\",\"id\":\"id6\"},{\"name\":\"Child\",\"id\":\"id7\"},{\"name\":\"a\",\"id\":\"id8\"},{\"name\":\"a\",\"id\":\"id9\"},{\"name\":\"a\",\"id\":\"id10\"}]}

有什么办法可以阻止它逃离角色吗? JSON 文件应如下所示

{
            "title"         :   "Armstrong",
            "description"   :   "The Armstrong Family",
            "patriarchID"   :   "id1",
            "latestID"      :   7,
            "members"       :   [
                {
                    "name"  :   "Grandad",
                    "id"    :   "id1",
                    "children": ["id2","id3"]
                },
                {
                    "name"  :   "Dad",
                    "id":       "id2",
                    "children": ["id4","id5","id6","id7"]
                },
                {
                    "name"  :   "Uncle",
                    "id"    :   "id3"
                },
                {
                    "name"  :   "Child",
                    "id" :  "id4"
                },
                {
                    "name"  :   "Child",
                    "id"    :   "id5"
                },
                {
                    "name"  :   "Child",
                    "id"    :   "id6"
                },
                {
                    "name"  :   "Child",
                    "id"    :   "id7"
                }

            ]
}

【问题讨论】:

标签: php jquery ajax json escaping


【解决方案1】:

也许您在 php.ini 中打开了magic quotes。你应该把它们关掉。这将解释转义

编辑 - 如果您需要了解更多关于魔术引号的信息,请阅读 here。魔术引号不好,如果您可以访问 php.ini,则应将其关闭

【讨论】:

  • 听起来很有趣,我该怎么做,会影响其他任何事情吗?
  • 如果您需要了解有关魔术引号的更多信息 [阅读此处]php.net/manual/en/security.magicquotes.php。魔术引号不好,如果你可以访问你的 php.ini,你应该关闭它们
  • 这似乎是问题所在。现在调查他们,谢谢!
【解决方案2】:

您已启用magic_quotes_gpc,并且在您启用$data = $_POST['data'] 时斜线已经存在。

看到这个答案:Slash appended to all my posts

顺便说一句,您可以将 fopen/fwrite/fclose 替换为 file_put_contents

【讨论】:

  • 谢谢,没有看到其他问题,但它成功了!
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多