【问题标题】:How to validate if input is only a number? intval and is_init not working如何验证输入是否只是一个数字? intval 和 is_init 不起作用
【发布时间】:2016-09-12 15:44:57
【问题描述】:

我需要验证用户在输入字段中插入的值是否只是一个数字。输入字段是价格,因此只应接受 0 到 9 之间的有效数字,并且我也会避免使用小数点。

所以在阅读之后我发现也许我可以使用intval 返回输入值的整数,然后比较is_int 是否输入只是整数。我想避免is_numeric,因为这样+0123.45e6这样的代码可以返回true

但我没有运气,不知怎的,它并没有像我打算的那样工作。这是我要验证的代码。

$price = isset($_POST['price']) ? intval($_POST['price']) : '';

if( ($price != '') && (!is_int($price)) ) { // If price is correct
   $throw_error[] = __( '<strong>ERROR</strong>: Price must be only number.' );
   $errors = true;
   $price = '';
}

但不知何故,这无法验证,并且像sdadaar 这样的一些字母可以传递错误。

【问题讨论】:

  • 所有帖子数据都是字符串:php.net/manual/en/function.is-numeric.php
  • 我知道,这就是为什么我想使用intval 不会intval 将该字符串转换为整数值?
  • 如果将其转换为整数,那么它将始终传递is_int()
  • 您发布的代码应该可以工作。这使我怀疑您没有在此处提交整个代码,并且您实际上是在更下方使用$_POST['price']
  • @ChristianF 这是代码中唯一与价格相关的部分,也许我应该提到这是在 WordPress 内部完成的,但由于它只是页面模板中的自定义函数,我不认为什么都有。

标签: php validation int


【解决方案1】:

所有帖子值都是字符串。您可以尝试is_numeric(),或者松散地(不检查类型)将字符串与强制转换为整数的字符串进行比较:

if($_POST['price'] != (int)$_POST['price']) {
    // error
}

在您当前的代码中,无效的整数/非数字数据将被转换为整数 0,并且始终通过 is_int() 测试。

Type Juggling

【讨论】:

  • 嗯等等你说,如果我有intval('sasdkosa'),它将被转换为0的整数值,所以基本上这就是is_int错误传递的原因,因为我有一个值0 .我现在就去看看。
  • 你是对的,这就是验证不起作用的原因,var_dump 实际上将值传递为0 但奇怪的是为什么它不像其他字段那样插入数据库.现在看起来更像是 WordPress 问题。
【解决方案2】:

如果你真的需要使用自制的函数来检查is_int()而不想要is_numeric(),试试这个:

if (strlen((int)$_POST['price']) !== strlen($_POST['price'])) echo "Not an integer";

任何不是数字的输入加上任何浮点数都将被 (int) 截断,因此它们的字符串长度将不等于 $_POST['price'] 的字符串长度。

【讨论】:

    【解决方案3】:

    试试这样的:

        $price = isset($_POST['price']) ? htmlspecialchars(trim($_POST['price'])) : null;        
    
        if($price && preg_match("#[a-z\.\-]*#i", $_POST['price']) ){
            $throw_error[] = __( '<strong>ERROR</strong>: Price must be only number.' );
            $errors        = true;
            $price         = '';            
        }
    

    【讨论】:

    • 但是价格可以设置为0,关键是如果价格为0则标记为免费商品。
    • 好吧……当然……你说得对……@AleksandarĐorđević
    • 尝试使用 preg-match() @AleksandarĐorđević 匹配输入中的字符串
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2011-07-20
    相关资源
    最近更新 更多