is_int()无法在PHP中检查$ _GET?

ilh*_*han 7 php integer get

这是我的代码:

<?php
$id = $_GET["id"];

if (is_int($id) === FALSE)  {
    header('HTTP/1.1 404 Not Found');
    exit('404, page not found');
    }
?>
Run Code Online (Sandbox Code Playgroud)

它总是进入if.

Mat*_*hew 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');
}
Run Code Online (Sandbox Code Playgroud)

但是更强大的解决方案将涉及某种类型的输入字符串验证/过滤,如PHP的内置filter_input_array().

(10月13日编辑,因为它仍然收到了赞成票,而且措辞有些令人困惑.)

  • 超出当天的赞成票,但这个答案实际上说明了使用is_numeric的原因.POST或GET发送的任何HTTP请求参数都将始终为字符串. (3认同)

sal*_*the 5

$ _GET数组中的用户输入(以及其他超级全局)都采用字符串的形式.

is_int检查值的类型(即string),而不是它是否包含类似整数的值.为了验证输入是一个整数字符串,我建议使用类似的东西ctype_digit或整数过滤器(FILTER_VALIDATE_INT这有利于实际将值更改为整数类型).当然你也可以用它进行类型转换(int).