【问题标题】:JSON Object broken using json_encode when apostrophies are present存在撇号时使用 json_encode 破坏 JSON 对象
【发布时间】:2013-10-09 04:25:42
【问题描述】:

情况如下:

我的程序接受用户在表单中输入的输入,并使用 PHP 的 PDO 和 Prepared Statements 将其保存在 MYSQL 数据库中。


数据通过 AJAX 调用检索并使用 json_encode 编码为 JSON,如下所示:

echo "<script> var jsonData = '". json_encode($profileData) . "';</script>";


然后用JQuery解析:

var Profile = jQuery.parseJSON(jsonData);


这很好用,直到用户输入 ' 字符。

即如果用户输入单词

我是


它将像这样被转义并存储在数据库中:I\'m


从数据库中检索后,JSON 编码的字符串将如下所示:

<script> var jsonData = '{"fname":"Daniel","about":"i\\'m a nerd"}';</script>


虽然' 被转义了,但似乎破坏了JSON。

我看到有人发布查找/替换样式的变通办法,但我宁愿避免这种方法。

肯定有一些方法可以处理这个问题,还是我以某种方式错误地初始化了 JSON 对象?

非常感谢任何帮助,如果需要更多信息,请询问:)

【问题讨论】:

  • 这里的语法高亮显示它,你已经过度转义了'
  • 当使用 PDO 准备好的语句时,您不应该在数据库中手动转义 ',PDO 会为您正确处理存储/检索它。 I'm 应存储为 I'm,而不是 I\'m
  • @JoachimIsaksson 我没有进行任何手动转义。准备好的语句将' 存储在数据库中为\'
  • @JoachimIsaksson ..但你是对的,额外的反斜杠必须去掉 :)
  • 该死的魔法语录! XD 使用共享主机必须让他们将其关闭..

标签: php jquery mysql json prepared-statement


【解决方案1】:

解决问题的最简单方法是在 JS 中省略引号:

echo "<script> var jsonData = " . json_encode($profileData) . ";</script>";

这将导致

<script> var jsonData = {"fname":"Daniel","about":"i\\'m a nerd"};</script>

那么jsonData 将已经是一个对象并且不必被解析。虽然逃跑可能有点过。

【讨论】:

  • 为我工作,谢谢! (我知道这会很简单)但是正如@JoachimIsaksson 在 cmets 中指出的那样,看起来我也在做一些有趣的事情,这导致了双反斜杠。
【解决方案2】:

从数据库中检索后,JSON 编码的字符串将如下所示:

<script> var jsonData = '{"fname":"Daniel","about":"i\\'m a nerd"}';</script>

虽然 ' 被转义,但它似乎破坏了 JSON。

请注意,这里的 JSON 涉及转义反斜杠。因此,引号不会被转义 - 你仍然必须这样做,以免弄乱你放在它周围的引号。

echo "<script> var jsonData = '". json_encode($profileData).replace(/'/g, "\\'" . "';</script>";

【讨论】:

    【解决方案3】:

    在编码 JSON 时使用 JSON_HEX_APOS 参数

    json_encode($profileData, JSON_HEX_APOS);
    

    这会将单引号变成只有 JSON 才能理解的特殊转义值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2018-02-26
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      相关资源
      最近更新 更多