PHP $ _POST,数组和键中的[]

时间:2018-11-09 15:24:26

标签: php arrays encoding

将文件名列表上传到php时出现问题。如果文件名包含],它将破坏PHP中的数组解码。

也可以使用$ _GET复制它,如下所示。

我希望将此原样解码:

Array
(
    [a] => Array
        (
            [b[]] => c
        )

)

目标是在包含[]字符的数组中包含键

index.php?a [b []] = c

给我这个:

Array
(
    [a] => Array
        (
            [b[] => c
        )

)

对它们进行编码会遇到相同的问题

index.php?a [b%5B%5D] = c

给我这个:

Array
(
    [a] => Array
        (
            [b[] => c
        )

)

双重编码也不起作用 index.php?a [b%255B%255D] = c

给我这个:

Array
(
    [a] => Array
        (
            [b%5B%5D] => c
        )

)

是否可以对此进行编码,因此PHP会将其解码为带有包含

的字符串的键的数组

3 个答案:

答案 0 :(得分:2)

引用我的评论。您将焦点放在桌子的另一侧。问题不是输入信息的处理,而是您的客户端提交的数据未正确传递数据。方括号是 UNSAFE 字符,可以提交到端点,而提交此信息的客户端是您需要进行更改的地方,而不是后端处理数据的地方。 / p>

在以下网址中阅读安全和不安全字符:

Stop using unsafe characters in URL's

括号用于定义嵌套列表数据,而您尝试使用它的方式将破坏该逻辑,您将不得不更改前端(或执行HTTP请求的任何方式)对该数据进行编码的方式。

enter image description here

答案 1 :(得分:0)

我不知道您上传的文件,您是否需要[-文件名中是否包含字符,但是我可以这样建议$ _GET数组出现问题:

<? dump($_GET['a']); // Array([b[] => c)
$arr = [];
foreach ($_GET['a'] as $key => &$value) {
    $vl = str_replace('[', '', $key);
    dump($key); // b[
    dump($vl); // b
    $arr[$vl] = $value;
}
dump($arr); // Array([b] => c)
?>

希望它对您有帮助。

答案 2 :(得分:-2)

如果您编写了一个小脚本,则可以询问PHP首选什么:

<?php
$c = 0;
$data = array(
    "a" => array(
        "b[]" => $c
    )
);
echo "<pre>";
var_export($data);
echo "\r\na[b[]]=c Encoded: " . urlencode("a[b[]]=c");
echo "</pre>";
?>

结果

array (
  'a' => 
  array (
    'b[]' => 0,
  ),
)
a[b[]]=c Encoded: a%5Bb%5B%5D%5D%3Dc

更新

我编写了以下代码只是为了查看浏览器如何对其进行编码:

<html>
    <head>
        <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
        <script>
            $(function(){
                $("form").submit(function(e){
                    e.preventDefault();
                    var data = $(this).serialize();
                    console.log(data);
                });
            });
        </script>
    </head>
    <body>
        <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
            <label for "a">a[b[]] = </label>
            <input type="text" name="a[b[]]" id="a" value="c" />
            <br />
            <button type="submit">
                Go
            </button>
        </form>
    </body>
</html>

单击Go时,我会在控制台中看到以下内容:

a%5Bb%5B%5D%5D=c

然后我通过urldecode()运行它时:

<?php
echo urldecode("a%5Bb%5B%5D%5D=c");
?>

我看到以下结果:

a[b[]]=c

因此,您似乎不需要对=符号进行编码,但是您确实希望对[]进行正确的编码:%5B和{{1} }。

因此,如果您想使用:

%5D

我建议:

index.php?a[b[]]=c

希望有帮助。