我有一个包含字段和文本区域的表单,允许输入任何字符。我不能只提交表单,因为表单被多次循环使用,因此表单值存储在关联数组中:
<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);
- 似乎工作正常 - 没有错误
问题:
我想获取表单数据 - 正确处理它 - 将其存储在MySQL中,然后在需要时将其读回表单。
全部谢谢:)
答案 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攻击。为了解决这个问题,你应该过滤服务器上的数据。
这将:
</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字符串。这会给你带来很大的灵活性,并且可能会在将来咬你。