PHP过滤器输入(输入服务器和请求方法)返回null?
为什么在我的live server中此行返回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
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'));