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

17

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

Например, если у меня есть URL-адрес: Ссылка name = Max браузер преобразует его в Ссылка .

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

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

    
задан user30724 12.11.2008 в 13:10
источник
  • возможный дубликат Get PHP, чтобы остановить замену '.' символов в массивах $ _GET или $ _POST? –  Rok Kralj 25.02.2015 в 17:12

4 ответа

34

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

  

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

     

Как правило, PHP не изменяет   имена переменных, когда они   перешел в сценарий. Однако это   следует отметить, что точка (период,   полная остановка) не является допустимым символом в   имя переменной 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.

    
ответ дан Greg 12.11.2008 в 13:21
  • Странно, редактор переходит в бесконечный цикл, если я попытаюсь сделать второй абзац цитатой вместо кода –  Greg 12.11.2008 в 13:23
  • Насколько я помню, квадратные скобки не просто заменяются символом подчеркивания, а позволяют допускать несколько значений в массив. –  Adam Byrtek 12.11.2008 в 13:26
  • Я думаю, это означает, что у вас есть один, например «hell [o». Если у вас есть соответствующая пара, тогда вы правы, она создаст массив. –  Greg 12.11.2008 в 13:31
  • Я не покупаю их аргументы. Правильный способ сделать это - сохранить целостность $ _GET и просто изменить эти имена глобальных переменных. –  Milan Babuškov 17.03.2015 в 12:36
5

Я думаю, что единственная возможность получить нужные параметры - это проанализировать их самостоятельно, используя $_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];
}
    
ответ дан Rudi 27.03.2009 в 13:25
  • заметил сегодня, что параметры «массива», такие как «foo [0] = bar», не будут интерпретироваться так, как ожидалось. –  Rudi 25.08.2011 в 16:03
  • правильно, но вы, вероятно, этого не хотите, так или иначе, если вы ожидаете, что имена полей являются неправильными именами PHP-переменных и будут искажены PHP, встроенными в разбор. –  Guss 02.04.2016 в 16:12
  • Для более краткой (и менее побочной) версии парсинга строки запроса Rudi я написал это: $ query = array_reduce (array_map (function ($ part) {return array_map (function ($ kv) {return urlecode ($ kv);}, explode ('=', $ part, 2));}, explode ('&', $ _ SERVER ['QUERY_STRING'])), function ($ query, $ pair) {$ query [$ pair [0]] = @ $ pair [1]; return $ query;}, []); (возможно, вы захотите его скопировать и отформатировать) –  Guss 02.04.2016 в 16:20
3

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

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

    
ответ дан Adam Byrtek 12.11.2008 в 13:24
1

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

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

    
ответ дан Fred 12.11.2008 в 13:20
  • У меня такая же проблема с преобразованием точек в "". Я хотел использовать точки для прямого сопоставления с таблицей базы данных с именами псевдонимов, например, table_name.column_name. Поскольку php преобразует точки в "", строка становится непригодной для использования "table_name_column_name". Как бы вы решили? –  Anatoliy 27.08.2013 в 10:03