如何在使用filter_put的同时检查POST和GET数据


How to check for both POST and GET data whilst using filter_input?

我想知道是否可以获取一个变量,无论它是在POST还是get中,然后使用filter_put()对其进行清理。

起初,我认为$var = filter_input(INPUT_POST | INPUT_GET, "var", FILTER_SANITIZE_STRING)可能有效,但它不起作用,而且PHP手册规定您只能传递一种类型的输入。

我还尝试了INPUT_REQUEST,奇怪的是它不起作用。该函数可以识别它(即它不会抛出一个错误,说我在$input中放错了什么),但它不会得到任何代码。是的,我知道不要在现场环境中使用INPUT_REQUEST,我只是纯粹测试它是否有效。

目前我做以下工作:

$var = filter_input(INPUT_POST, "var", FILTER_SANITIZE_STRING);
if(!$var) $var = filter_input(INPUT_GET, "var", FILTER_SANITIZE_STRING);

然而,对于PHP中的许多内容,通常有一种更简单的方法可以在一个命令中为我完成所有操作。我想知道这里是不是这样,我能把它们合并成一张支票吗?我在谷歌上粗略搜索了一下,甚至找不到任何以前尝试过的人的参考资料,更不用说解决方案了,所以现在我求助于你们这些好人。

如果您不知道您的输入是在GET还是POST中,则认为这是一种糟糕的做法。你应该永远知道,而不是随便接受任何东西。

我认为没有比用您已经提到的代码创建自定义函数更好的方法了:

function getPostOrGet($name) {
  $var = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING);
  if(!$var) $var = filter_input(INPUT_GET, $name, FILTER_SANITIZE_STRING);
  return $var;
}

如果你认为这是正常的,你就不能使用|运算符,因为如果它在两者中都定义了会发生什么。

还要注意,由于这是一种糟糕的做法,它没有一种"简单"的方法。因此,如果你真的需要,请使用自定义函数,如果可以的话,只使用正确的输入类型。

派对迟到了一点。我也有同样的问题。对于这种情况,我的解决方案是这样的:
$data = array_merge(filter_input_array(INPUT_POST), filter_input_array(INPUT_GET));
$var = $data["var"];

如果在使用filter_put_array中的选项之前需要进行消毒:http://php.net/manual/de/function.filter-input-array.php

例如:

$args = array(
    'var'   => FILTER_SANITIZE_STRING
);

合并:

$data = array_merge(filter_input_array(INPUT_POST, $args), filter_input_array(INPUT_GET, $args));
$var = $data["var"];

根据我的阅读,您可以将表单中的值POST更改为GET-这样您只需要接受GET-不确定我是否正确理解了它。

如果您正确地清理您的输入,我会亲自测试filtre_inputnull的结果,因为if(!$var)条件可能由一个错误但现有的值(如0)触发。

例如:

function getLatitude($name) {
  $var = filter_input(INPUT_POST, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  if($var === null){
      $var = filter_input(INPUT_GET, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  }
  return $var;
}

使用通常的!$var条件和FILTER_SANITIZE_NUMBER_FLOAT,您将获得null值,而不是0

旧主题,但在某些情况下,它可能很方便

$var = filter_var($_REQUEST['var'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);