【问题标题】:is_int, is_numeric, is_float, and HTML form validationis_int、is_numeric、is_float 和 HTML 表单验证
【发布时间】:2011-07-26 02:35:30
【问题描述】:

我的 HTML 表单上的选择字段可能会产生 1 到 5(整数)。每次使用 is_int 都会拒绝它,因为 $_POST['rating'] 被视为字符串。

在查阅 PHP 手册后,似乎 is_numeric() && !is_float() 在这种情况下是验证整数的正确方法。

但我想确定,所以请确认或开除我的逻辑。

【问题讨论】:

  • 你是对的。那将是正确的验证机制。

标签: php html validation int


【解决方案1】:

is_int 要求输入内容为整数。 is_numeric 要求输入内容为整数或字符串,仅包含 0-9

但我想知道如果我将一个大于PHP_INT_MAX 的数字作为参数放入上述两个函数中的结果。

【讨论】:

    【解决方案2】:

    如果您想知道 $_POST['rating'] 是否是 int ,甚至在尝试强制转换之前请使用 is_numeric() && !is_float() 。这将告诉您字符串是否为 int。如果你只是转换为一个 int 并且有一个非数字字符串中第一个字母之前的所有数字都转换为一个 int。

    x = 457h
    print (int)x
    

    输出 457

    x = h56
    print (int)x
    

    输出 0

    【讨论】:

      【解决方案3】:

      您可以使用以下正则表达式:

      preg_match('/^[0-9]{1,}$/', $value);
      

      我确实验证了带有前导零的数字...

      【讨论】:

      • 也可以使用/^\d+$/
      【解决方案4】:

      我可能会使用这样的东西:

      $value = filter_var(
        $_POST['rating'], 
        FILTER_VALIDATE_INT, 
        array('options' => array('min_range' => 1, 'max_range' => 5))); 
      

      filter_var() 将返回布尔值 false 如果值是非整数或超出范围,或者返回有效值本身(作为整数)。

      【讨论】:

        【解决方案5】:

        如果您只测试数字(通常是整数;)),我倾向于使用 ctype_digit 而不是 is_int。这样,你就不会因为强制转换而丢失数据,而且你可以只使用一个字符串:

        <?php
        $_POST['foo'] = '42';
        echo ctype_digit( (string) $_POST['foo'] ) ? 'yep' : 'nope';
        

        这将输出“yep”。

        【讨论】:

        • 运行is_numeric() &amp;&amp; !is_float()如何丢失数据?
        • @Tomalak 我认为他指的是铸造,例如(int) 'abc' // 0.
        • @alex:我真的不明白。 OP 没有选角。
        • 嗨。是的,对不起,我指的是他们使用强制转换的其他答案,即过滤,而不是验证。 is_numeric( $var ) && !is_float( ) 应该也可以。
        • @Tomalak 来自 Berry 的回答:这样,您就不会因投射而丢失数据
        【解决方案6】:

        您始终可以将其转换为 int。

        $rating = (int)$_POST['rating'];
        

        这将消除验证它的需要(即使您应该始终验证表单数据)。 这可能会减少你的步数,这就是我的意思。

        【讨论】:

        • 如果输入是:'10test',那么 int() 的结果将是 10。换句话说,错误的用户输入突然被解释为正确的。
        【解决方案7】:

        我会使用is_numeric(),因为用户输入总是以字符串形式出现(据我所知)。

        另一种保证整数是整数的方法是强制转换...

        $id = (int) $id;
        

        【讨论】:

        • 但它必须是整数。为什么不需要!is_float()
        • 我猜是因为is_numeric(0.1)TRUE :)
        • 我想你不明白。我只想将用户输入限制为整数。十进制值应该被丢弃//提示更正。在这种情况下,我认为仅is_numeric() 是不够的。也许我们正在互相交谈?
        • @Andrew 我想你可能误解了我的意思。如果我提交一个号码,例如5.5is_numeric() 将返回 TRUE,因为它数字。但是您不想要浮点数,因此我们还确保它不是带有is_float() 否定的浮点数(这将返回TRUE,因为它 一个浮点数)。希望这是有道理的:)
        • @Joao 你是对的,但 OP 正在谈论 select 元素。在1 之外提交到5 的任何内容都已由最终用户进行了调整,因此我认为发生未定义的行为并不是一件容易的事。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多