在表单的隐藏字段中提交的 JSON 编码的 PHP 数组 - 在提交表单的页面中打印出来时会产生奇怪的输出

Sol*_*ace 3 javascript php forms post json

在下面的 SSCCE 中,在 中index.php,打印了一个按钮。当你点击这个按钮时,form会提交一个(在buttonJS的点击监听器中),其中包含一个隐藏input字段,其值为json_encode($anArray)

action表单的属性值为test.php,因此表单被提交到test.php

在 中test.php,我打印了 的内容$_POST,但得到了这个奇怪的输出:

Array ( [something] => { )

问题是为什么,我该怎么做才能解决它?

第二个问题是,目前test.php在新选项卡中打开,我可以强制它在新窗口中打开吗?

测试.php:

<?php 

if (isset($_POST["something"])) {
    print_r(  $_POST  );
} else {
    echo '$_POST["something"] is not set.';
}

?>
Run Code Online (Sandbox Code Playgroud)

脚本.js:

$(document).ready(function() {

$("#someButton").click(function() {

    window.open('', 'TheWindow');   document.getElementById('TheForm').submit(); });

});
Run Code Online (Sandbox Code Playgroud)

索引.php:

<?php 

$dataToPass = array(
        "A" => array(
                1 => array(
                        "id" => 1,
                        "secondId" => 2,
                        "thirdId" => 3
                )
        ),


        "B" => array(
                1 => array(
                        "id" => 4,
                        "secondId" => 5,
                        "thirdId" => 6
                ),
                2 => array(
                        "id" => 7,
                        "secondId" => 8,
                        "thirdId" => 9
                )
        ),


        "C" => array(
                1 => array(
                        "id" => 10,
                        "secondId" => 11,
                        "thirdId" => 12
                )
        )

);

?>

<!DOCTYPE html>

<html>

<head>

<script src="jquery.min.js"></script>

<script src="scripts.js"></script>

</head>




<body>

<?php
print_r(json_encode($dataToPass));echo "<br><br>";//check
?>

<button id="someButton">Click me</button>

<form id="TheForm" method="post" action="test.php" target="TheWindow">
    <input type="hidden" name="something" value="<?php echo json_encode($dataToPass); ?>" />
</form>


</body>

</html>
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 5

您的<input>标签应如下所示:

<input type="hidden" name="something" value='<?php echo json_encode($dataToPass); ?>' >
Run Code Online (Sandbox Code Playgroud)

请注意对value属性使用单引号字符而不是双引号。JSON 字符串包含双引号字符;您的 HTML 到达浏览器时如下所示:

<input type="hidden" name="something" value="{"A":..." />
Run Code Online (Sandbox Code Playgroud)

这就是为什么你得到的价值是{.

确实,为了确保一切正常(JSON也可以包含单引号),您应该使用 HTML 编码器将任何嵌入的单引号或双引号字符转换为 HTML 实体。这样你就可以保证最终的 HTML 不会混淆 HTML 解析器。