Подтвердить что ты не робот

PHP заменяет пробелы подчеркиваниями

У меня проблема, что PHP заменяет все пробелы подчеркиваниями в переменных POST и GET.

Например, если у меня есть URL-адрес: http://localhost/proxy.php?user name = Max браузер преобразует его в http://localhost/proxy.php?user%20name=Max.

Но если я выдаю параметры $_GET, ключ не является именем пользователя, а user_name!

Есть ли возможность изменить это поведение?

4b9b3361

Ответ 1

Из руководства PHP:

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

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

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

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

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

И комментарий на странице:

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

chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)

PHP необратимо модифицирует имена полей, содержащие эти символы, в попытке поддерживать совместимость с устаревшей функцией register_globals.

Ответ 2

Я думаю, что единственная возможность получить нужные параметры - это проанализировать их самостоятельно, используя $_SERVER['QUERY_STRING']:

$a_pairs = explode('&', $_SERVER['QUERY_STRING']);
foreach($a_pairs AS $s_pair){
  $a_pair = explode('=', $s_pair);
  if(count($a_pair) == 1) $a_pair[1] = '';

  $a_pair[0] = urldecode($a_pair[0]);
  $a_pair[1] = urldecode($a_pair[1]);

  $GLOBALS['_GET'][$a_pair[0]] = $a_pair[1];
  $_GET[$a_pair[0]] = $a_pair[1];
}

Ответ 3

В старые сумасшедшие времена строка запроса register_globals была распакована PHP в глобальные переменные, но формат идентификаторов переменных ограничен, поэтому очевидно, что пробелы не могут работать. Это ограничение сохранилось, и, честно говоря, я считаю хорошей идеей сохранить его таким образом.

Если вы действительно не можете изменить пробелы в символах подчеркивания в своих URL-адресах, просто производите массив $_GET при обработке запроса и замените каждое подчеркивание пробелом.

Ответ 4

Насколько я помню, я никогда не видел пробелов в именах параметров URL...

Думаю, было бы лучше преобразовать все пробелы имен параметров в "_".