为什么$ _POST中的字符串不能包含点“。”?

时间:2010-09-18 17:17:11

标签: php post

基本上,标题就是这样。我在我的页面上有一个隐藏的输入,我想将名称设置为“some.major.uber.setting”

例如: <input type="hidden" name="some.major.uber.setting" value="dummy value" />

当我查看$ _POST数据时,它包含“some_major_uber_setting”。任何人都可以解释这种行为

4 个答案:

答案 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'));