точка в имени переменной - PullRequest
8 голосов
/ 29 июня 2009

Я передаю переменную с точкой в ​​строке запроса. Php заменяет точку на знак ниже. Так, как я могу сохранить имя переменной, которая имеет точку в имени

http://localhost/sample.php?one.txt=on&two.txt=on

sample.php

$ ret = $ _ REQUEST ['one.txt']; // Не работает

Ответы [ 3 ]

27 голосов
/ 29 июня 2009

Причина, по которой PHP преобразовывает имя вашей переменной из one.txt в one_txt, заключается в том, что точки недопустимы в именах переменных.

Подробнее см. В документации PHP :

Имена переменных следуют тем же правилам как и другие метки в PHP. Действительный имя переменной начинается с буквы или подчеркивание, за которым следует любое количество буквы, цифры или подчеркивания. Как регулярное выражение, это было бы выражается так: '[A-Za-Z_ \ x7f- \ XFF] [A-Za-z0-9_ \ x7f- \ XFF] *

Вы можете либо учесть это изменение (. до _) и проверить на $_REQUEST['one_txt'], либо вместо этого вы можете заставить свою HTML-форму передавать правильное имя переменной.

Edit:

Чтобы прокомментировать комментарий Майкла Боргвардта, вот текст из PHP документации по обработке переменных из внешних источников :

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

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

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

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

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

Это действительно специфичная для PHP вещь.

6 голосов
/ 06 января 2012

Использовать $ _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] => в [two.txt] => вкл)

4 голосов
/ 20 августа 2014

Разработчики 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; 
}
...