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