基本上,标题就是这样。我在我的页面上有一个隐藏的输入,我想将名称设置为“some.major.uber.setting”
例如:
<input type="hidden" name="some.major.uber.setting" value="dummy value" />
当我查看$ _POST数据时,它包含“some_major_uber_setting”。任何人都可以解释这种行为
答案 0 :(得分:22)
这可能是register_global = On times的遗留问题。 $ _GET / $ _ POST变量被转换为标准变量($ _GET ['foo']变为$ foo)。变量名称不能包含点,因此它们在内部转换。
答案 1 :(得分:13)
自10年前的original commit to CVS以来一直存在。
它有一个评论:
/ *确保变量名中没有空格或点(不是二进制安全)* /
我不知道为什么它不是“二元安全”......你必须问Zeev。
当前链接:https://github.com/php/php-src/blob/master/main/php_variables.c#L93
答案 2 :(得分:8)
在php.net
中记录为:
变量名中的点和空格将转换为下划线。
答案 3 :(得分:0)
正如我在其他答案中所提到的,这是解决这种不幸行为的功能。
function fix(&$target, $source, $discard = true) {
if ($discard)
$target = array();
$source = preg_replace_callback(
'/(^|(?<=&))[^=[&]+/',
function($key) { return bin2hex(urldecode($key[0])); },
$source
);
parse_str($source, $post);
foreach($post as $key => $val)
$target[ hex2bin($key) ] = $val;
}
然后你可以像这样调用这个函数:
fix($_POST, file_get_contents('php://input'));