Почему строки в $ _POST не могут содержать точку "."? - PullRequest
26 голосов
/ 18 сентября 2010

В основном название говорит, что все.у меня был скрытый ввод на моей странице, где я хотел установить имя "some.major.uber.setting"

например: <input type="hidden" name="some.major.uber.setting" value="dummy value" />

и когда я посмотрел на $_POST данные, которые он содержит "some_major_uber_setting".Кто-нибудь может объяснить это поведение

Ответы [ 4 ]

22 голосов
/ 18 сентября 2010

Это, вероятно, реликт из register_global = On times.Переменные $ _GET / $ _ POST были превращены в стандартные переменные ($ _GET ['foo'] стал $ foo).Имена переменных не могут содержать точек, поэтому они были внутренне преобразованы.

13 голосов
/ 18 сентября 2010

Это происходит с момента первоначальной фиксации CVS , более 10 лет назад.

В ней есть комментарий:

/ * обеспечитьу нас нет пробелов или точек в имени переменной (не бинарный безопасный) * /

Я понятия не имею, почему это не "бинарный безопасный" ... Вы должны спроситьЗеев.

Текущая ссылка: https://github.com/php/php-src/blob/master/main/php_variables.c#L93

8 голосов
/ 18 сентября 2010

Это задокументировано в php.net как:

Точки и пробелы в именах переменных преобразуются в подчеркивания.

0 голосов
/ 13 августа 2014

Как уже упоминалось в моем другом ответе, эта функция исправляет это неудачное поведение.

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;
}

И затем вы можете вызвать эту функцию так:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...