Точка в имени переменной

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

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

sample.php

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

3 ответа

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

Для получения более подробной информации смотрите документацию PHP:

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

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

Редактировать:

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

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

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

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

Теперь то, что анализатор видит, это переменная с именем $ varname, за которой следует оператор конкатенации строк, за которым следует строка с ограничением (то есть строка без кавычек, которая не соответствует ни одному из известных ключей или зарезервированных слов) '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);

Результат для вашего примера Array ( [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; 
}
Другие вопросы по тегам