PHP заменяет пробелы подчеркиванием - PullRequest
17 голосов
/ 12 ноября 2008

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

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

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

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

Ответы [ 4 ]

34 голосов
/ 12 ноября 2008

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

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

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

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

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

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

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

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

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

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

5 голосов
/ 27 марта 2009

Я думаю, что единственная возможность получить нужные параметры - это проанализировать их самостоятельно, используя $_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 голосов
/ 12 ноября 2008

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

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

1 голос
/ 12 ноября 2008

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

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

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