PHP过滤器输入(输入服务器和请求方法)返回null?

PHP过滤器输入(输入服务器和请求方法)返回null?,php,filter-input,Php,Filter Input,为什么在我的live server中此行返回null filter_input(INPUT_SERVER, 'REQUEST_METHOD'); 实时服务器是php5.5.9 我错过什么了吗 我以为它是用来取代下面的全局方法的 $_SERVER['REQUEST_METHOD']; 一些代码 public function __construct() { // Construct other generic data. $this->client

为什么在我的live server中此行返回
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();
        }
    }

我遇到了同样的问题,它在我的本地机器(OSX Mavericks,PHP版本5.4.24)上工作,而不是在我的实时服务器(Cent OS 5)上工作。我将服务器从5.3.9升级到5.5.15(并添加了mb和mcrypt函数,尽管这可能无关紧要),现在它可以工作了


如果您在共享主机上,这可能没有帮助,但您可以询问他们是否可以重建PHP/Apache。

我的XAMPP localhost中也遇到了同样的问题,并且正在疯狂地寻找解决方案。最后,如果您在FCGI模式下运行PHP(在我的例子中是FCGI/php5.4),那么这个函数就是一个已知的PHP错误。我被证实经历了这一切


我使用的解决方法是
filter\u var($\u SERVER['PHP\u AUTH\u USER',filter\u SANITIZE\u STRING)
,但这不是
filter\u input
的替代方法
filter\u input
更安全。

FastCGI在使用input\u SERVER和input\u ENV时,似乎会产生奇怪的副作用,产生意外的空值。您可以使用此代码查看它是否影响服务器

如果您想安全起见,使用superglobal$\u服务器和$ENV变量将始终有效。您仍然可以毫无问题地使用Get/Post/Cookie的filter*函数,这是最重要的部分


来源:

所以问题/缺陷是:

filter\u input()在使用FASTCGI

这个bug已经被发现很多年了,我没有发现任何东西表明它被解决了。我找到了一些解决方案,但没有完整的解决方案,因此我将最好的解决方案投入到这个助手函数中,以获得项目范围的解决方案。为了提供某种程度的安全性并避免火车失事,函数返回到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;
    }
}

这似乎是最好的解决办法。请让我知道它是否包含可能导致问题的错误。

我通过更改我的
php.ini
来解决它:

variables_order = "GPCS"
致:

默认情况下,PHP没有注册环境变量,因此此更改启用了它们。有趣的是,
INPUT\u服务器
变量也开始工作了

只有两个附加信息,我使用的是PHP7.0.13,正如在其他答案中所说的,这个问题与

另一个选项是使用以下选项:

filter_var(getenv('REQUEST_METHOD'));

如果不应用过滤器,为什么要使用
filter\u input()
?如果没有设置[…]变量,它将返回“
NULL
”,还可以看到他已经将变量名设置为
'REQUEST\u METHOD'
,并且过滤是可选的,所以我也很好奇为什么没有设置work@birdspider如果我使用
$\u服务器['REQUEST\u METHOD']
而不是
过滤器输入(输入服务器,'REQUEST\u METHOD'),我会得到数据
这可能是一个长期存在的php错误-找不到它的参考。我认为php脚本作为AJAX请求或正常页面加载运行并不重要。在任何情况下,$\u服务器或$\u POST/$\u GET/$\u请求的作用都是相同的。因此,在通过AJAX调用的PHP脚本中,您可以对POST/GET使用filter\u输入,对$\u服务器使用filter\u var。我的脚本中有一个错误,这就是为什么我似乎无法访问POST数据。谢谢你的回复。
filter_var(getenv('REQUEST_METHOD'));