【发布时间】:2011-03-09 06:47:35
【问题描述】:
这是我的代码:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
它总是进入 if 里面。
【问题讨论】:
-
而
$_GET实际上包含...什么?
这是我的代码:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
它总是进入 if 里面。
【问题讨论】:
$_GET实际上包含...什么?
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 日编辑了帖子,因为它仍在接受投票,而且措辞有些混乱。)
【讨论】:
is_numeric 没有相同的效果,例如还允许十六进制值通过其他(参见 php.net)
is_numeric() 不适合检查整数 ID。在实践中,所有用户输入都应该通过filter_var() 或其他类似的显式例程传递。
$_GET 数组(以及其他超全局变量)中的用户输入都采用字符串的形式。
is_int 检查值的类型(即string),而不是它是否包含类似整数的值。为了验证输入是否为整数字符串,我建议使用类似ctype_digit 或整数filter(FILTER_VALIDATE_INT——这实际上将值更改为整数类型的好处)。当然你也可以用(int)进行类型转换。
【讨论】:
来自 is_int 的 PHP 文档:
注意:要测试一个变量是否是 数字或数字字符串(例如 表单输入,它始终是一个字符串), 你必须使用is_numeric()。
【讨论】:
任何用户输入都以字符串形式出现,因为 PHP 无法判断您期望数据是什么数据类型。
如果您想确保它是整数,请将其转换为整数或使用正则表达式。
<?php
$id = $_GET["id"];
if ((int) $id == 0) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
【讨论】:
尝试使用is_numeric 而不是is_int。 is_numeric 检查是否给出了可以是数字的东西(我认为$_GET 返回字符串)。 is_int 检查变量是否为int 类型
【讨论】:
使用is_numeric()评估内容,使用is_int()评估类型。
【讨论】:
或者,您可以只使用正则表达式匹配来检查字符串是否为整数。
if(preg_match('/^\d+$/',$_GET['id'])) {
// is an integer
}
【讨论】: