如何检查$ _GET数组中的变量是否为整数?

时间:2012-08-30 09:51:34

标签: php get validation

我有一个这样的页面:

  

http://sitename/gallery.php?page=2

它底部有分页链接,我们可以通过它浏览。每次点击页码时,都会发送参数页面= 1 页面= 2 的GET请求,等等...

当我从teh $page变量将这些值存储到$_GET时,它是一个字符串值。我可以使用(int)将其转换为整数:

if(!empty($_GET['page'])){
       $page = (int)$_GET['page'];
       echo "Page Number: ".$page;
}

但是,如何确保传递的值仅为 整数 而不是其他废话?

9 个答案:

答案 0 :(得分:16)

使用过滤器:

if (null !== ($page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE))) {
    // $page is now an integer
}

这还会检查变量是否同时出现在查询字符串中。如果您想区分缺失和无效,则必须将最后一个参数留给filter_input()

$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);
// $page can be null (not present), false (present but not valid) or a valid integer

答案 1 :(得分:4)

filter_var()FILTER_VALIDATE_INT过滤器一起使用,并检查返回值。

答案 2 :(得分:1)

使用is_numeric()

is_int()将无效,因为GET参数始终为字符串。

答案 3 :(得分:1)

我在这里和那里留下了一些评论。由于输入较弱,emptyisset等功能往往不可靠。检查参数是否为int或IMO的最快方法是:

if (array_key_exists('page',$_GET) && ($_GET['page'] == (int) $_GET['page']))

仅当$_GET['page'] 是有效的int时,转换为int然后比较各自的值才会返回true。如果你想出于某种原因使用严格的类型比较(有些原因),你可以进行双重投射:

if (array_key_exists('page',$_GET) && ($_GET['page'] === (string)((int) $_GET['page'])))

但在这种特殊情况下,我真的不明白你为什么要那样做

答案 4 :(得分:1)

这是一种如何检查参数是否为整数的方法。

if (is_int((int) $_GET['user_id']) && (int) $_GET['user_id'] != 0) {
    $user_id = $_GET['user_id'];
}

答案 5 :(得分:0)

使用is_int可能无济于事。所有传入的参数(包括$ _GET和$ _POST)都被PHP解析为字符串。 is_int函数检查数据类型,而不是值。 ctype_digit仅检查数字:

if(isset($_GET['page']) && ctype_digit($_GET['page']){
   $page = (int)$_GET['page'];
   echo "Page Number: ".$page;
}

答案 6 :(得分:0)

if(!empty($_GET['page']) and is_numeric($_GET['page'])){
       $page = (int)$_GET['page'];
       echo "Page Number: ".$page;
}

is_numeric可能就是你所需要的。

答案 7 :(得分:0)

您也可以查看

isNAN($_GET['something']);//is_numeric($_GET['something'])

它返回一个布尔值(true,flase)....如果是真的那么它不是一个整数,假如它是一个整数。

答案 8 :(得分:0)

if (isset($_GET['page']) && (($get_page_filtered = filter_var($_GET['page'], FILTER_VALIDATE_INT)) !== FALSE) {
  $get_page_int = $get_page_filtered;
}

@see https://stackoverflow.com/a/41868665/6758130