PHP - 如果GET键未设置,filter_input将设置为默认值

9
我希望有一种简洁优雅的方式,如果 GET 参数被设置并且是数字,则将变量设置为该参数的值,如果未设置,则将其设置为 0(或其他默认值)。
目前我的代码如下:
if (($get_id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT))) {
    $opened_staff['id'] = $get_id;
    // some database queries etc.
} else { $opened_staff['id'] = 0; }

我尝试使用回调函数,如果值为空或不是数字,则返回0,但是如果未设置GET参数'id',则回调甚至不会被调用-它只会将$ get_id 设置为null。

包含else语句并不是什么大问题,只是觉得可能会错过一些filter_input的功能。


请给我更清晰的解释。 - I'm Geeker
2个回答

23

filter_input函数接受一个options参数。每种过滤器都接受不同的选项。例如,FILTER_VALIDATE_INT过滤器可以接受defaultmin_rangemax_range等选项,如此处所述

$get_id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, array("options" => array(
    "default" => 0,
    "min_range" => 0
)));
var_dump($get_id);

// $get_id = 0 when id is not present in query string, not an integer or negative
// $get_id = <that integer> otherwise

1
太好了,这就是我缺少的东西。在选项数组中设置默认键。谢谢! - tangopianist
如果您还需要添加其他标志,它们应该在 flags 键中。例如 array("options" => array("default" => []), "flags" => FILTER_REQUIRE_ARRAY); - PhoneixS

3
您可以使用默认选项来实现这一点。如果没有设置值,则会分配默认值,例如如下所示:
$options = array( 'options' => array('default'=> 0) ); 
$valid = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, $options); 

filter_input()函数不会从_POST/_GET/_COOKIE/_SERVER/_ENV读取数据。

$opened_staff['id'] = 0;
if($valid){
  $opened_staff['id'] = $_GET['id'];
}

您可以使用一些类来实现这一点。[注意: 这只是一个例子]
class RequestFilter{
 public static function get_filter_int($id){

   $options = array( 'options' => array('default'=> 0) ); 
   $valid = filter_input(INPUT_GET, $id, FILTER_VALIDATE_INT, $options); 

   if($valid){
     return $_GET[$id]; // Value will return
   }

   return $valid; // Default will return
 }
}

$opened_staff['id'] = RequestFilter::get_filter_int('id');

这里将返回值或默认值,这里默认值为零。


2
由于在这种情况下您已经提取了有效值,为什么不直接在 if 语句中返回 $valid 呢?还是我缺少了某些原因?(对 PHP 相对较新) - Levon
你根本不需要if语句,如果valid为“true”,则返回$_GET[$id],这与$valid相同,因为filter_input在值有效时返回该值。否则,返回$valid。因此,你总是返回与$valid相同的内容。 - PhoneixS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接