4

我有一个这样的页面:

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

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

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

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

但是我怎样才能确保传递的值只是一个整数而不是其他废话?

4

9 回答 9

18

使用过滤器:

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
于 2012-08-30T09:59:58.943 回答
4

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

于 2012-08-30T09:55:16.527 回答
2

使用is_numeric()

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

于 2012-08-30T09:58:13.483 回答
1

我在这里和那里留下了一些评论。由于弱类型化,函数喜欢empty并且isset往往是不可靠的。检查参数是否为 int 的最快方法是 IMO:

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

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

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

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

于 2012-08-30T10:10:29.187 回答
1

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

if (is_int((int) $_GET['user_id']) && (int) $_GET['user_id'] != 0) {
    $user_id = $_GET['user_id'];
}
于 2014-01-24T07:30:38.863 回答
0

使用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;
}
于 2012-08-30T09:57:46.790 回答
0
if(!empty($_GET['page']) and is_numeric($_GET['page'])){
       $page = (int)$_GET['page'];
       echo "Page Number: ".$page;
}

is_numeric可能是您需要的。

于 2012-08-30T09:58:03.203 回答
0

你也可以检查

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

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

于 2012-08-30T10:11:41.557 回答
0
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

于 2017-01-26T07:48:43.717 回答