【问题标题】:How can I check if form input is numeric in PHP?如何在 PHP 中检查表单输入是否为数字?
【发布时间】:2008-11-25 16:16:25
【问题描述】:

我需要能够查看 PHP 中的表单输入是否为数字。如果它不是数字,则网站应重定向。我试过 is_numeric() 但它似乎不起作用。

代码示例会很好。

我正在开发一个接受整数值作为数量的购物车。我正在尝试这个:

if(!is_numeric($quantity)){
                //redirect($data['referurl']."/badinput");
                echo "is not numeric";
        }

【问题讨论】:

  • 请发布一些代码,以便我们了解为什么 is_numeric() 不适合您。

标签: php validation numeric


【解决方案1】:
if(!is_numeric($quantity == 0)){
                //redirect($data['referurl']."/badinput");
                echo "is not numeric";

这里有两个嵌套条件。 假设 $quantity 为 1。

第一个条件计算 1 == 0 并返回 FALSE。 第二个条件检查 FALSE 是否为数字并返回 FALSE,因为 FALSE 不是数字。

只写:

if (!is_numeric($quantity))
{
    echo 'is not numeric';
}

【讨论】:

    【解决方案2】:

    您可能应该解释一下“数字”是什么意思——积分、浮点、指数符号等? is_numeric() 将接受所有这些。

    如果要检查字符串是否只包含数字,则可以使用正则表达式,例如

    /^\d+$/
    

    如果您要像使用整数一样使用实际值,您可能希望通过intval() 传递它,如果无法解析该值,它将返回0 - 如果@987654327 @ 是一个有效值,那么您可能必须以某种方式处理它,也许是通过限制值的下限。

    【讨论】:

    • 您的正则表达式中有一个小错误。应该是 /^\d+$/ 你需要对 d 进行转义。
    【解决方案3】:

    使用 JavaScript 对输入进行一些客户端验证也是明智之举。

    往返于服务器的往返行程很长,可能会造成拼写错误,您可以通过让客户端浏览器预先进行一些质量保证来减少服务器开销。

    【讨论】:

    • 这里的评论太晚了,但是如果您执行上述操作,出于安全原因,请执行此操作以及服务器端验证。
    【解决方案4】:

    检查is_intis_numeric。每个链接中都有示例。如果您需要更多帮助,我会发布您遇到问题的数据和代码示例。

    编辑:

    $quantity == 0
    

    将始终是数字,因为它将返回一个布尔值(1 或 0)。正确的做法:

    if ( is_numeric( $quantity ) ) {
    ...
    }
    

    if ( is_int( $quantity ) ) {
    ...
    }
    

    【讨论】:

      【解决方案5】:

      另一种选择是ctype_digit。来自文档:

      Checks if all of the characters in the provided string, text, are numerical. Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.
      
      <?php
      $strings = array('1820.20', '10002', 'wsl!12');
      foreach ($strings as $testcase) {
          if (ctype_digit($testcase)) {
              echo "The string $testcase consists of all digits.\n";
          } else {
              echo "The string $testcase does not consist of all digits.\n";
          }
      }
      ?>
      

      上面的例子会输出:
      字符串 1820.20 不包含 所有数字。
      字符串 10002 由所有数字组成。
      这 字符串 wsl!12 不包含所有数字。

      <?php
      
      $numeric_string = '42';
      $integer        = 42;
      
      ctype_digit($numeric_string);  // true
      ctype_digit($integer);         // false (ASCII 42 is the * character)
      
      is_numeric($numeric_string);   // true
      is_numeric($integer);          // true
      ?>
      

      【讨论】:

        【解决方案6】:

        Rob 所说的,虽然我会使用 ctype_digit 而不是正则表达式来检查数字

        【讨论】:

          【解决方案7】:

          到目前为止,tharkun 给出了最好的答案。如果你问这样的问题,我猜你现在还不想开始搞乱 reg-exp。

          重新思考你的逻辑。为什么要检查 $quantity==0 是否为数字结果?如果您试图避免错误 b/c,您认为数量可能没有指定值,那么您检查的时间有点晚。这是您的应用程序中一个非常常见(也是邪恶的)安全漏洞——如果 $quantity 的值完全来自用户输入,请确保在输入到达执行点之前对其进行清理。作为问题的一小部分,您不需要指定默认值,因为您之前已对输入进行了清理(而清理是您处理“无输入”情况的地方)。

          祝你好运!

          【讨论】:

          • 是的,整个问题都来自一个错字。傻我
          【解决方案8】:

          使用正则表达式:/^\d+$/ 应该可以解决问题

          【讨论】:

            【解决方案9】:

            试试这个:

            $numeric = "1"; //true default
            
            $string = trim($_GET['string']);
            
            $chkarray = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ",", ".");
            
            for ($i=0; $i < strlen($string); $i++) { 
                if (!in_array(substr($string, $i, 1), $chkarray)) {
                    $numeric = "0";
                    break;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2016-12-21
              • 2011-08-05
              • 2012-12-30
              • 1970-01-01
              • 2021-09-14
              • 2011-07-22
              • 1970-01-01
              相关资源
              最近更新 更多