【问题标题】:PHP filter_input(INPUT_SERVER, 'REQUEST_METHOD') returns null?PHP filter_input(INPUT_SERVER, 'REQUEST_METHOD') 返回空值?
【发布时间】:2014-08-10 20:59:28
【问题描述】:

为什么此行在我的实时服务器中返回 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();
        }
    }

【问题讨论】:

  • 如果你不应用过滤器,为什么要使用filter_input()
  • Doc says 它返回“NULL if the [...] variable is not set”,另见this comment
  • 他已经将变量名设置为'REQUEST_METHOD',并且过滤是可选的,所以我也很好奇为什么这不起作用
  • @birdspider 如果我使用$_SERVER['REQUEST_METHOD'] 而不是filter_input(INPUT_SERVER, 'REQUEST_METHOD'),我会得到数据
  • 这可能是一个长期存在的 php 错误bugs.php.net/bug.php?id=49184 - 无法找到已修复的参考

标签: php filter-input


【解决方案1】:

所以问题/错误是这样的:

当您使用 FASTCGI 时,

filter_input() 不适用于 INPUT_SERVERINPUT_ENV

该错误已为人所知多年,但我没有发现任何迹象表明它已得到解决。我找到了几种解决方法,但没有完整的解决方案,因此我将最好的解决方法放入此帮助函数中,以实现项目范围的解决方案。为了提供一定程度的安全性并避免火车残骸,该函数回退到 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】:

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

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

    【讨论】:

      【解决方案3】:

      我在我的 XAMPP localhost 中也遇到了同样的问题,并且正在疯狂地寻找解决方案。我最终得到的结果是,如果您在 FCGI 模式下运行 PHP(在我的情况下为 FCGI/PHP 5.4),则此函数是一个已知的 PHP 错误。我被确认通过了这个link.

      我使用的解决方法是filter_var($_SERVER['PHP_AUTH_USER'], FILTER_SANITIZE_STRING),但这不是filter_input 的替代方案。 filter_input 更安全。

      【讨论】:

      • 我认为 PHP 脚本作为 AJAX 请求或正常页面加载运行并不重要。在任何情况下,$_SERVER 或 $_POST/$_GET/$_REQUEST 都一样。因此,在您通过 AJAX 调用的 PHP 脚本中,您可以将 filter_input 用于 POST/GET 并将 filter_var 用于 $_SERVER。
      • 是的,你是对的,我很抱歉。我的脚本中有错误,这就是为什么我似乎无法访问 POST 数据的原因。感谢您的回复。
      【解决方案4】:

      在将 INPUT_SERVER 和 INPUT_ENV 与此函数一起使用时,FastCGI 似乎会导致带有意外空值的奇怪副作用。您可以使用此代码查看它是否会影响您的服务器。

      如果您想安全起见,使用超全局 $_SERVER 和 $ENV 变量将始终有效。您仍然可以毫无问题地使用过滤器*功能来获取/发布/Cookie,这是重要的部分!

      来源:http://php.net/manual/es/function.filter-input.php#77307

      【讨论】:

        【解决方案5】:

        我解决了它,将我的php.ini 更改为:

        variables_order = "GPCS"
        

        收件人:

        variables_order = "GPCSE"
        

        默认情况下 PHP 没有注册环境变量,所以这个更改启用了它们。有趣的是INPUT_SERVER 变量也恢复了工作!

        只有两个附加信息,我使用的是 PHP 7.0.13,正如其他答案中所说,这个问题与 PHP bug 有关。

        另一种选择是使用以下内容:

        filter_var(getenv('REQUEST_METHOD'));
        

        【讨论】:

          【解决方案6】:

          我个人的解决方案是将 filter_input 更改为 filter_var

          使用 filter_input(不适用于 Siteground 共享主机):

          filter_input(INPUT_SERVER, 'REQUEST_URI')
          

          使用 filter_var(现在可以在 Siteground 上使用)

          filter_var($_SERVER['REQUEST_URI'],FILTER_UNSAFE_RAW, FILTER_NULL_ON_FAILURE)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多