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

时间:2013-01-30 04:04:40

标签: 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']; ?>');

我得到一个错误:语法错误:预期令牌')'或语法错误:缺少)参数列表


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

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

现在,如果我尝试将 stringified 值传回数组

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

- 似乎工作正常 - 没有错误


问题:

  • 为什么我在尝试重建ARRAY时遇到此错误 张贴 JSON.stringify()值?
  • 我是否按原样在MySQL中保存此JSON.stringify()值?
  • 或者我首先使用PHP json_decode()吗?

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

全部谢谢:)

1 个答案:

答案 0 :(得分:1)

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>

  

我是否按原样在MySQL中保存此JSON.stringify()值?或者我首先使用PHP json_decode()吗?

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

如果您只是要存储数据然后检索它,那么您可能无法做到并且在数据库中存储JSON字符串。这会给你带来很大的灵活性,并且可能会在将来咬你。

相关问题