php - JSON数组转PHP/MySQL JSON.parse JSON.stringify如何存储双引号和单引号

标签 php mysql json parsing stringify

我有一个带有字段和文本区域的表单,允许输入任何字符。我不能只提交表单,因为表单被多次回收,因此表单值存储在关联数组中:

<form name='Theform'>

    <input type="text" id="VISITOR_DETAILS_NAME" value="Joe">
    <input type="text" id="VISITOR_DETAILS_SIZE" value="Large">
    <textarea id='VISITOR_DETAILS_INFO'>
       User can enter anything here including double " and single ' quotes
    </textarea>
<input type="hidden" name="package" id="package" value="" />

</form>

文本区域值与其他表单值一起存储在 JavaScript 数组中:

myArray[0]['VISITOR_DETAILS_NAME'] = document.getElementById('VISITOR_DETAILS_NAME').value;
myArray[0]['VISITOR_DETAILS_SIZE'] = document.getElementById('VISITOR_DETAILS_SIZE').value;
myArray[0]['VISITOR_DETAILS_INFO'] = document.getElementById('VISITOR_DETAILS_INFO').value;

我最终得到一个像这样的数组:

{
VISITOR_DETAILS_NAME : "Joe",
VISITOR_DETAILS_SIZE : "Large",
VISITOR_DETAILS_INFO : "User can enter anything here including double " and single ' quotes"
};

然后,我使用 JSON.stringify 将此 JavaScript 数组传递到隐藏表单字段,然后将其 POST 到 PHP:

document.getElementById('package').value = JSON.stringify(myArray[0]);
Theform.submit();

(现在我只是发布到 iframe 来测试 JSON 是否通过 POST 正确传递 JavaScript 数组)。

当我在 PHP 端得到它时 - 看起来很好。看起来 JSON.stringify 已将反斜杠添加到双引号 (\") - 现在我想将这些值存储在 MySQL 中。但我想先测试我是否可以将 JSON 作为数组发送/重建回 javascript - 所以我尝试这样做:

parent.myArray[0] = JSON.parse('<?php echo $_POST['package']; ?>');

我收到错误:SyntaxError: Expected token ')' OR SyntaxError: Missing ) after argument list

<小时/>

这对我来说很奇怪 - 因为当我在没有发布的情况下尝试它时 - 它似乎工作得很好,如下所示:

document.getElementById('package').value = JSON.stringify(myArray[0]);

现在,如果我尝试将字符串化值传回数组

myArray[0] =  JSON.parse(document.getElementById('package').value);

- 看起来工作正常 - 没有错误

<小时/>

问题:

  • 为什么在尝试从以下位置重建数组时会出现此错误 已发布 JSON.stringify() 值?
  • 我是否将这个 JSON.stringify() 值按原样保存在 MySQL 中?
  • 或者我先用 PHP json_decode() 来处理它?<​​/li>

我想抓取表单数据 - 正确处理它 - 将其存储在 MySQL 中,然后在需要时将其读回到表单中。

谢谢大家:)

最佳答案

parent.myArray[0] = JSON.parse('<?php echo $_POST['package']; ?>');

这里,您尝试将 JSON 文本转换为 JSON 文本的 JavaScript 字符串表示形式的 HTML 表示形式,但您没有执行任何操作来转义它。

如果您有' JSON 数据中的字符,那么它们将终止 JavaScript 字符串。

如果您有" JSON 数据中的字符,那么它们将表示为 \" ,但是\"" 的 JavaScript 字符串表示形式。由于您没有执行任何操作来转义放入 JS 字符串中的文本,因此斜杠字符将被 JavaScript 解析器消耗,并在到达 JSON 解析器之前消失。

如果您想转换数据以放入 JavaScript 字符串中,那么您需要对其进行转义。

但是,JSON(几乎)是 JavaScript 的子集。因此,将 JSON 文本转换为 JavaScript 字符串以便将其解析为 JavaScript 对象的过程过于复杂。您可以跳过它,直接进入:

<script>
var foo = <?php echo $json; ?>
</script>

但是,由于您是从客户端获取 JSON,因此直接回显将使您面临 XSS 攻击。为了解决这个问题,您应该过滤服务器上的数据。

这将:

  • 无法解析任何无效的 JSON,因此不会输出错误的 JSON(但它可能不会输出任何内容,从而给您带来 JSON 语法错误,您应该应用测试来查看解析是否成功,并在失败时输出合理的默认情况) .
  • 转换任何</script>数据中为<\/script>使其安全地放置在脚本元素中(因为这就是 PHP 的 json_encode 的工作原理

例如:

<!-- I don't do PHP, this is untested -->
<script>
var foo = <?php
    $unsafe_json = $_POST['package'];
    $data_structure = json_parse($unsafe_json);
    $safe_json = json_encode($data_structure);
    echo $safe_json;
?>;
</script>
<小时/>

Do I save this JSON.stringify() value in MySQL as is? Or do I PHP json_decode() it first?

这取决于您打算如何处理数据。 一般将数据放入数据库时​​,最好从数据格式中提取数据并对其进行规范化。这样您就可以对其运行查询。

如果您只想存储数据然后检索它,那么您可能可以不这样做并将 JSON 字符串存储在数据库中。但这会让你失去很多灵 active ,并且可能会在未来困扰你。

关于php - JSON数组转PHP/MySQL JSON.parse JSON.stringify如何存储双引号和单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14596503/

相关文章:

php - Laravel 5 集合问题 : Where not equal to

php - 从加入中删除重复条目

mysql - 对 MySQL 行重新排序 : move row "up"

java - 安卓/MySQL : how can I display data based on the department associated with the logged-in user?

java - 从网络(Twitter)读取 JSON 数据

javascript - 如何在 JavaScript 中动态设置对象的属性

php - 如何更改日期格式? (YII)

mysql - 同表中父子关系的分层数据连接

json - WCF 无法反序列化 JSON 请求

php - 使用 PHP 将 XML 转换为关联数组