使用 is_numeric 验证表单输入中的整数

Posted

技术标签:

【中文标题】使用 is_numeric 验证表单输入中的整数【英文标题】:Validate Integer in Form Input Using is_numeric 【发布时间】:2013-09-06 01:42:17 【问题描述】:

在我的表格中,输入了一个团队的分数,由 php 脚本验证,然后传递到 mysql 数据库。但是,我想确保提交的是一个正整数,因此在制作联赛积分榜时后端没有问题。

研究使我得出结论,使用 is_numeric 将是解决此问题的最佳方法。但是,它无法将零识别为整数,这对我来说是个问题。当我在数组中单独回显它时,它显示为 true,但是我在脚本中编写它的方式不起作用。

我尝试先用 intval 转换 $_POST,然后用 is_numeric 处理数字,但这似乎没有帮助。代码如下:

// Validate the away score:
if (empty($_POST['away_score'])) 
    echo "You forgot to enter the away score.<br>";
    $validate = 'false';
 elseif (!is_numeric($_POST['away_score'])) 
    echo "You entered an invalid score for the away team.<br>";
    $validate = 'false';
 else 
    $away_score_value = mysqli_real_escape_string($db, trim($_POST['away_score']));
    $validate = 'true';

有什么想法吗?

【问题讨论】:

POST[$_'$away_score']....?这只是一个非常奇怪的复制/粘贴错误,还是实际上是您的 PHP 脚本中的内容? 为什么引号中的$?你没有其他任何人... @cHao 对不起,那只是我在复制/粘贴时是个白痴。已修复,但遗憾的是问题仍然存在。 【参考方案1】:

字符串'0' 不真实。这意味着任何以布尔方式检查它的东西都会将其视为错误。特别是,empty($_POST['away_score']) 将评估为true,因此is_numeric 甚至永远不会有失败的机会。

短版:empty 在这种情况下太花哨了。明确检查 null 和 ''

if (!isset($_POST['away_score']) or $_POST['away_score'] == '') 

【讨论】:

当像 4.2 这样的浮点数时会发生什么?..op 想要检查一个正整数 @EmilioGort:在验证的这一点上,什么都没有。您可能想要获取它的 intval() 并查看它是否与输入大致相等,如果它必须是整数。 这解决了问题。很有意思。非常感谢您的帮助!【参考方案2】:

您可以使用内置验证。探索来自Validation examples 的几个示例。并阅读filter_input。

例如。

var_dump(filter_input(INPUT_POST, 'score', FILTER_VALIDATE_INT, array(
    'options' => array(
        'min_range' => 1,
        'max_range' => 5,
    )
)));

附:使用准备好的语句。

【讨论】:

【参考方案3】:
ctype_digit( (string) $score);

preg_match('#^\d+$#', $score);

在 b4 @EmilioGort

boolean false

int 0

【讨论】:

@EmilioGort 它在你的 4.2 测试“之前”;)【参考方案4】:
<?php

try 

    // Check if user submitted "away_score" with valid form.
    // "away_score" can be UNDEFINED or STRING or ARRAY.
    if (!isset($_POST['away_score']) || !is_string($away_score = $_POST['away_score'])) 
        throw new RuntimeException('You cannot access without valid form submitting.');
    
    // If "away_score" is not filled in, this will be EMPTY STRING.
    if ($away_score === '') 
        throw new RuntimeException('You forgot to enter the away score.');
    
    // Check if trimmed "away_score" has only digits.
    if (!ctype_digit($away_score = trim($away_score))) 
        throw new RuntimeException('You entered an invalid score for the away team.');
    

    // do something

 catch (Exception $e) 

    printf("<p>%s</p>\n", $e->getMessage());


【讨论】:

【参考方案5】:

使用正则表达式

if (preg_match('/\A\d++\z/', $variable))//including 0
 //do somthing
else
 echo "This is not a Positive Integer"

is_numeric(4.2) 用浮点数返回 true

如果数据是使用$_POST$_GET 等超全局变量获得的,则is_int(2) 返回false

【讨论】:

/\A\d++\z/ 是一个完美的正则表达式。 $ 可能包含 CRLF 或 LF。 @CertaiN 请给我一个例子? ideone.com/fEwG6A 但后来trim 他打来电话,所以这不是绝对必要的,对不起.. 而且\d++\d+ 效率更高,因为没有回溯。 \d+ 在匹配失败时回溯。示例:1abcdef; PCRE 尝试检查以下所有情况。 1abcdef->1abcde->1abc->1ab->1a->1【参考方案6】:
 elseif (!preg_match('/^([0-9]+)$/', $_POST['away_score'], $m)) 
  $AwayScore = $m[1];  # $AwayScore to go to mysql
  echo 'not numeric!';
  $valid = false;

这行得通! preg_match() 适用于任何类型,包括整数/长整数/浮点数,任何类型!

【讨论】:

为什么无缘无故投反对票......这是有效的,请阅读我关于 LF 和 CRLF 的回答中的 cmets【参考方案7】:

但是使用is_numeric 在PHP中检查给定输入是否为数字的正确方法,并且

var_dump(is_numeric(0));

应该返回bool(true)。你试过is_int吗?

【讨论】:

4.2 使用 is_numeric 返回 true 谢谢,我确实像您发布的那样运行了 var_dump,它确实返回了 true。无论出于何种原因,当我在输入字段中输入 0 时,它无法识别该数字。我现在就试试 is_int。【参考方案8】:
elseif (!is_numeric(POST[$_'$away_score']) && !is_null(POST[$_'$away_score']))

因为 0(或 null)不是数值,所以必须检查分数是否为 null。

【讨论】:

4.2 使用 is_numeric 返回 true undefined 不等于 NULL NULL 等于 0,我们不是在谈论 undefined。 并且在他使用比 PDO 更高效和性能更高的 MySQLi 时停止谈论 PDO(对于 MySQL 请求)。 @RobotChief 你为什么这么说? (事实)MYSQLI > PDO

以上是关于使用 is_numeric 验证表单输入中的整数的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 和 php 测试表单输入是 1 位还是 2 位整数

使用休眠验证器的 Spring mvc 表单验证

表单验证1

elementui表单验证小于300的正整数

使用 AngularJS 比较表单验证中的两个输入值

在 laravel 5 中的表单请求验证后传递旧输入