Заставьте PHP прекращать заменять '.' символы в $ _GET или $ _POST массивы?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

71
задан eLRuLL 16 December 2017 в 23:10
поделиться

3 ответа

Вот объяснение PHP.net того, почему оно делает это:

Точки во входящих именах переменной

Как правило, PHP не изменяет названия переменных, когда они передаются в сценарий. Однако нужно отметить, что точка (период, точка) не является допустимым символом в имени переменной PHP. По причине посмотрите на него:

<?php
$varname.ext;  /* invalid variable name */
?>

Теперь, то, что видит синтаксический анализатор, является переменной, названной $varname, сопровождаемым оператором объединения строк, сопровождаемым barestring (т.е. закрыл кавычки строка, которая не распознает никаких известных ключевых или зарезервированных слов), 'расширение'. Очевидно, это не имеет намеченного результата.

поэтому важно отметить, что PHP автоматически заменит любые точки во входящих именах переменной с подчеркиваниями.

Это от http://ca.php.net/variables.external .

кроме того, согласно этот комментарий эти другие символы преобразовываются в подчеркивания:

полный список символов имени поля, которые PHP преобразовывает в _ (подчеркивание), следующий (не просто точка):

  • chr (32) () (пространство)
  • chr (46) (.) (точка)
  • chr (91) ([) (открывают квадратную скобку)
  • chr (128) - chr (159) (различный)

, Таким образом, похоже, что Вы застреваете с ним, таким образом, необходимо будет преобразовать подчеркивания назад в точки в сценарии с помощью предложение dawnerd (я просто использовал бы str_replace все же.)

63
ответ дан Community 24 November 2019 в 12:53
поделиться

Причина это происходит, из-за старой register_globals функциональности PHP. символ не является допустимым символом в имени переменной, таким образом, убежища PHP он к подчеркиванию для проверки существуют совместимость.

Короче говоря, это не хорошая практика, чтобы сделать периоды в переменных URL.

4
ответ дан Jeremy Privett 24 November 2019 в 12:53
поделиться

Давно ответ на вопрос, но на самом деле есть лучший ответ (или обходной путь). PHP позволяет вам использовать необработанный входной поток , поэтому вы можете сделать что-то вроде этого:

$query_string = file_get_contents('php://input');

, который выдаст вам массив $ _POST в формате строки запроса с точками, которые должны быть.

Вы можете затем проанализировать его, если вам нужно (согласно комментарий автора ).

<?php
// Function to fix up PHP's messing up input containing dots, etc.
// `$source` can be either 'POST' or 'GET'
function getRealInput($source) {
    $pairs = explode("&", $source == 'POST' ? file_get_contents("php://input") : $_SERVER['QUERY_STRING']);
    $vars = array();
    foreach ($pairs as $pair) {
        $nv = explode("=", $pair);
        $name = urldecode($nv[0]);
        $value = urldecode($nv[1]);
        $vars[$name] = $value;
    }
    return $vars;
}

// Wrapper functions specifically for GET and POST:
function getRealGET() { return getRealInput('GET'); }
function getRealPOST() { return getRealInput('POST'); }
?>

Очень полезно для параметров OpenID, которые содержат оба '.' и "_", каждый из которых имеет определенное значение!

58
ответ дан 24 November 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: