2014-08-10 1 views
6

Почему эта линия возвращает null на моем сервере?PHP filter_input (INPUT_SERVER, 'REQUEST_METHOD') возвращает null?

filter_input(INPUT_SERVER, 'REQUEST_METHOD'); 

Живой сервер php5.5.9

ли я что-то пропустил?

Я думал, что он используется для замены глобального метода ниже?

$_SERVER['REQUEST_METHOD']; 

часть кода,

public function __construct() 
    { 
     // Construct other generic data. 
     $this->clientRequestMethod = filter_input(INPUT_GET, 'method'); // such as list, add, update, etc 
     $this->clientPostMethod = filter_input(INPUT_POST, 'method'); // such as update 
     $this->serverRequestMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD'); //such as get or post 
    } 


    public function processEntry() 
    { 

     // Determine the $_SERVER['REQUEST_METHOD'] whether it is post or get. 
     if ($this->serverRequestMethod === 'POST' && $this->clientPostMethod != null) 
     { 
      $this->processPost(); 
     } 
     else if($this->serverRequestMethod === 'GET' && $this->clientRequestMethod != null) 
     { 
      $this->processRequest(); 
     } 
    } 
+1

Если вы не подаете фильтр, поэтому использовать 'filter_input()' на всех? –

+1

[Doc says] (http://php.net/manual/en/function.filter-input.php) возвращает «' NULL', если переменная [...] не установлена ​​», также см. [Этот комментарий ] (http://de2.php.net/manual/en/function.filter-input.php#77307) – kero

+1

Он задал имя переменной '' REQUEST_METHOD'', и фильтрация не является обязательной, поэтому мне также интересно почему это не работает – Ortix92

ответ

5

У меня была та же проблема, где он работал на моей локальной машине (OSX Mavericks, PHP версии 5.4.24), а не на моем рабочем сервере (Cent OS 5). Я обновил сервер с 5.3.9 до 5.5.15 (и добавил функции mb и mcrypt, хотя это, вероятно, не имеет значения), и теперь это работает.

Возможно, это не поможет, если вы находитесь на общем хосте, но можете спросить, могут ли они пересоздать PHP/Apache.

3

У меня была такая же проблема и на моем локальном хосте XAMPP, и я безумно искал решения. То, что я закончил, это известная ошибка PHP для этой функции, если вы используете PHP в режиме FCGI (FCGI/PHP 5.4 в моем случае). Я был подтвержден через это link.

Обходной путь, который я использовал, - filter_var($_SERVER['PHP_AUTH_USER'], FILTER_SANITIZE_STRING), но это не является альтернативой filter_input. filter_input более безопасен.

+0

Я не думаю, что имеет значение, если PHP-скрипт запускается как запрос AJAX или обычная загрузка страницы.В любом случае команда $ _SERVER или $ _POST/$ _ GET/$ _ REQUEST действует одинаково. Таким образом, в скриптах PHP, которые вы вызываете через AJAX, вы можете использовать filter_input для POST/GET и filter_var для $ _SERVER. –

+0

Да, вы правы, мне очень жаль. У меня была ошибка в моем скрипте, и поэтому мне казалось, что я не могу получить доступ к данным POST. Спасибо за ответ. – doABarrelRoll721

3

При использовании INPUT_SERVER и INPUT_ENV с помощью этой функции FastCGI вызывает странные побочные эффекты с неожиданными нулевыми значениями. Вы можете использовать этот код, чтобы узнать, влияет ли он на ваш сервер.

Если вы хотите быть в безопасности, использование суперглобальных переменных $ _SERVER и $ ENV всегда будет работать. Вы можете использовать фильтр * функции для Get/Post/Cookie без проблем, что является важной частью!

Источник: http://php.net/manual/es/function.filter-input.php#77307

6

Таким образом, проблема/ошибка заключается в следующем:

filter_input() не работает с INPUT_SERVER или INPUT_ENV при использовании Fastcgi

Эта ошибка известна годами, и я не нашел ничего, что говорилось бы об этом. Я нашел несколько обходов, но не имел полного решения, поэтому я применил наилучшую работу в этой вспомогательной функции для решения по всему проекту. Чтобы обеспечить некоторый уровень безопасности и избежать обломков поездов, функция возвращается к filter_var(), где filter_input() терпит неудачу. Он использует тот же формат, что и встроенная функция filter_input() для легкой интеграции в проекты и простого удаления в будущем, если ошибка будет исправлена.

function filter_input_fix ($type, $variable_name, $filter = FILTER_DEFAULT, $options = NULL) 
{ 
    $checkTypes =[ 
     INPUT_GET, 
     INPUT_POST, 
     INPUT_COOKIE 
    ]; 

    if ($options === NULL) { 
     // No idea if this should be here or not 
     // Maybe someone could let me know if this should be removed? 
     $options = FILTER_NULL_ON_FAILURE; 
    } 

    if (in_array($type, $checkTypes) || filter_has_var($type, $variable_name)) { 
     return filter_input($type, $variable_name, $filter, $options); 
    } else if ($type == INPUT_SERVER && isset($_SERVER[$variable_name])) { 
     return filter_var($_SERVER[$variable_name], $filter, $options); 
    } else if ($type == INPUT_ENV && isset($_ENV[$variable_name])) { 
     return filter_var($_ENV[$variable_name], $filter, $options); 
    } else { 
     return NULL; 
    } 
} 

Это кажется лучшим решением. Пожалуйста, дайте мне знать, если он содержит ошибки, которые могут вызвать проблемы.

2

Решаю это изменение моего php.ini от:

variables_order = "GPCS" 

To:

variables_order = "GPCSE" 

По умолчанию PHP не регистрировал переменные окружения, так что это изменение позволило им. Интересно, что переменные INPUT_SERVER вернулись к работе!

Только две вспомогательные данные, я использую PHP 7.0.13, и, как сказано в других ответах, эта проблема связана с PHP bug.

Другим вариантом является использование следующее:

filter_var(getenv('REQUEST_METHOD'));