我有一个这样的页面:
http://sitename/gallery.php?page=2
它的底部有分页链接,我们可以通过它进行浏览。每次点击页码时,它都会发送一个GET请求,参数为page=1或page=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参数始终是字符串。
我在这里和那里留下了一些评论。由于弱类型,像empty
和isset
这样的函数往往不可靠。检查参数是否为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