Intereting Posts

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я думаю, что единственная возможность получить нужные параметры – это проанализировать их самостоятельно, используя $_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]; } 

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

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

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

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