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


How to check whether a variable in $_GET Array is an integer?

我有一个这样的页面:

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

它的底部有分页链接,我们可以通过它进行浏览。每次点击页码时,它都会发送一个GET请求,参数为page=1page=2,依此类推。。。

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

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

但是,我如何确保传递的值是一个整数而不是其他垃圾?

使用过滤器:

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

使用带有FILTER_VALIDATE_INT过滤器的filter_var(),并检查返回值。

使用is_numeric()。

is_int()将不起作用,因为GET参数始终是字符串。

我在这里和那里留下了一些评论。由于弱类型,像emptyisset这样的函数往往不可靠。检查参数是否为int的最快方法是:

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'])))

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

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

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

使用is_int可能没有帮助。PHP将所有传入参数(包括$_GET和$_POST)解析为字符串。is_int函数检查的是数据类型,而不是值。ctype_digit只检查数字:

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

is_numeric可能正是您所需要的。

您也可以使用进行检查

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

它返回一个布尔值(true,flase)。。。。如果为true,则它不是整数,如果为false,则它是整数。

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

@参见https://stackoverflow.com/a/41868665/6758130