这是我的代码:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
它总是进入if。
答案 0 :(得分:32)
is_int
检查数据类型是否为整数,但$_GET
中的所有内容都是字符串。因此,它将始终返回false
。
在紧要关头,您可以转换为整数,然后检查!= 0。
$id = isset($_GET['id']) ? (int) $_GET['id'] : null;
if (!$id) { // === 0 || === null
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
但更强大的解决方案将涉及某种类型的输入字符串验证/过滤,如PHP的内置filter_input_array()
。
(10月13日编辑,因为它仍然收到了赞成票,而且措辞有些令人困惑。)
答案 1 :(得分:5)
$ _GET数组中的用户输入(以及其他超级全局)都采用字符串的形式。
is_int
检查值的类型(即string
),而不是它是否包含类似整数的值。为了验证输入是整数字符串,我建议使用ctype_digit
或整数filter(FILTER_VALIDATE_INT
- 这样做的好处是实际将值更改为整数类型)。当然,您也可以使用(int)
进行类型转换。
答案 2 :(得分:3)
来自is_int的PHP文档:
注意:测试变量是否为a 数字或数字字符串(例如 表单输入,总是一个字符串), 你必须使用is_numeric()。
答案 3 :(得分:1)
任何用户输入都以字符串形式出现,因为PHP无法告诉您期望数据的数据类型。
如果要确保它是整数,请将其转换为整数或使用正则表达式。
<?php
$id = $_GET["id"];
if ((int) $id == 0) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
答案 4 :(得分:1)
尝试使用is_numeric
代替is_int
。 is_numeric
检查是否给出了一个可以是数字的东西($_GET
返回我认为的字符串)。 is_int
检查变量是否为int
答案 5 :(得分:0)
使用is_numeric() 评估内容,使用is_int()评估类型。
答案 6 :(得分:0)
或者,您可以使用正则表达式匹配来检查字符串是否为整数。
if(preg_match('/^\d+$/',$_GET['id'])) {
// is an integer
}