将文件名列表上传到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会将其解码为带有包含
的字符串的键的数组答案 0 :(得分:2)
引用我的评论。您将焦点放在桌子的另一侧。问题不是输入信息的处理,而是您的客户端提交的数据未正确传递数据。方括号是 UNSAFE 字符,可以提交到端点,而提交此信息的客户端是您需要进行更改的地方,而不是后端处理数据的地方。 / p>
在以下网址中阅读安全和不安全字符:
Stop using unsafe characters in URL's
括号用于定义嵌套列表数据,而您尝试使用它的方式将破坏该逻辑,您将不得不更改前端(或执行HTTP请求的任何方式)对该数据进行编码的方式。
答案 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
希望有帮助。