【问题标题】:is_int() cannot check $_GET in PHP?is_int() 无法在 PHP 中检查 $_GET?
【发布时间】: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 get integer


【解决方案1】:

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 的原因。任何通过 POST 或 GET 发送的 HTTP 请求参数将始终是一个字符串。
  • +1 - 尽管要提到,is_numeric 没有相同的效果,例如还允许十六进制值通过其他(参见 php.net)
  • @Helmut,是的,is_numeric() 不适合检查整数 ID。在实践中,所有用户输入都应该通过filter_var() 或其他类似的显式例程传递。
【解决方案2】:

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

is_int 检查值的类型(即string),而不是它是否包含类似整数的值。为了验证输入是否为整数字符串,我建议使用类似ctype_digit 或整数filterFILTER_VALIDATE_INT——这实际上将值更改为整数类型的好处)。当然你也可以用(int)进行类型转换。

【讨论】:

    【解决方案3】:

    来自 is_int 的 PHP 文档:

    注意:要测试一个变量是否是 数字或数字字符串(例如 表单输入,它始终是一个字符串), 你必须使用is_numeric()

    【讨论】:

      【解决方案4】:

      任何用户输入都以字符串形式出现,因为 PHP 无法判断您期望数据是什么数据类型。

      如果您想确保它是整数,请将其转换为整数或使用正则表达式。

      <?php
      $id = $_GET["id"];
      
      if ((int) $id == 0)  {
          header('HTTP/1.1 404 Not Found');
          exit('404, page not found');
          }
      ?>
      

      【讨论】:

        【解决方案5】:

        尝试使用is_numeric 而不是is_intis_numeric 检查是否给出了可以是数字的东西(我认为$_GET 返回字符串)。 is_int 检查变量是否为int 类型

        【讨论】:

          【解决方案6】:

          使用is_numeric()评估内容,使用is_int()评估类型。

          【讨论】:

            【解决方案7】:

            或者,您可以只使用正则表达式匹配来检查字符串是否为整数。

            if(preg_match('/^\d+$/',$_GET['id'])) {
              // is an integer
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-10-15
              • 1970-01-01
              • 2014-11-05
              • 2013-06-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多