Я передаю переменную с точкой в строке запроса. Ppp заменяет точку с помощью оценки. Итак, как я могу сохранить имя переменной, которое имеет точку в названии
HTTP: //localhost/sample.php one.txt = на & two.txt = на
sample.php
$ ret = $ _ REQUEST ['one.txt']; // Не работает
Причина, по которой PHP преобразует ваше имя переменной из one.txt
в one_txt
состоит в том, что точки недействительны в именах переменных.
Для получения дополнительной информации см. Документацию по PHP :
Имена переменных следуют тем же правилам, что и другие метки в PHP. Правильное имя переменной начинается с буквы или подчеркивания, за которой следует любое количество букв, цифр или символов подчеркивания. В качестве регулярного выражения оно выражается следующим образом: «[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] * '
Вы можете либо учесть изменение ( .
$_REQUEST['one_txt']
_
), либо проверить $_REQUEST['one_txt']
иначе вы можете превратить вашу HTML-форму вместо допустимого имени переменной.
Чтобы прокомментировать комментарий Майкла Боргвардта, вот текст из документации PHP по обработке переменных из внешних источников :
Точки в именах входящих переменных
Как правило, PHP не изменяет имена переменных, когда они передаются в скрипт. Однако следует отметить, что точка (период, полная остановка) не является допустимым символом в имени переменной PHP. По этой причине, посмотрите на это:
<?php $varname.ext; /* invalid variable name */ ?>
Теперь, что видит синтаксический анализатор, это переменная с именем $ varname, за которой следует оператор конкатенации строк, за которым следует barestring (т.е. некорректная строка, которая не соответствует ни одному известному ключу или зарезервированным словам) 'ext'. Очевидно, это не имеет предполагаемого результата.
По этой причине важно отметить, что PHP автоматически заменяет любые точки в именах входящих переменных символами подчеркивания.
Это действительно особенность PHP.
Используйте $ _SERVER ['QUERY_STRING']
$get = array(); foreach(explode('&', $_SERVER['QUERY_STRING']) as $part) { $part = explode('=', $part); if($key = array_shift($part)) { $get[ $key ] = implode('', $part); } } print_r($get);
Результат для вашего примера Массив ([one.txt] => on [two.txt] => on)
Разработчики PHP внедрили это для поддержки register_globals (), но если бы они остановились более чем на одну секунду, чтобы рассмотреть последствия, они бы только изменили имена, импортированные в пространство имен глобальных переменных, а не в $ _POST. Существует меньше причин для изменения самих переменных запроса … ну, кроме того, что PHP не способен обрабатывать стандартные формы.
Вот решение для переменных POST, которое, вероятно, сложнее для большего числа пользователей, чем решение GET:
function post_data(){ $data=explode('&',file_get_contents("php://input")); $post=array(); foreach ($data as $var){ list($key,$value)=explode('=',$var,2); $post[$key]=urldecode($value); } return $post; }