0

在我的表格中,一个团队的分数被输入,由 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';
}

有什么想法吗?

4

8 回答 8

2

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

短版: empty在这种情况下太轻率了。''明确地检查空值。

if (!isset($_POST['away_score']) or $_POST['away_score'] == '') {
于 2013-09-06T02:02:55.307 回答
2

您可以使用内置验证。探索验证示例中的几个示例。并阅读有关filter_input的信息。

例如。

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

PS 使用准备好的语句。

于 2013-09-06T02:16:03.707 回答
1
<?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());

}
于 2013-09-06T01:55:36.183 回答
1
ctype_digit( (string) $score);

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

在 b4 @EmilioGort

boolean false

int 0
于 2013-09-06T01:55:51.957 回答
1

使用正则表达式

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

is_numeric(4.2)用浮点数返回 true

is_int(2)如果数据是使用 supergloblals 获得的,则返回 false$_POST$_GET

于 2013-09-06T01:58:21.553 回答
1
} elseif (!preg_match('/^([0-9]+)$/', $_POST['away_score'], $m)) {
  $AwayScore = $m[1];  # $AwayScore to go to mysql
  echo 'not numeric!';
  $valid = false;
}

这行得通!
preg_match() 适用于任何类型,包括 integer/long/float,任何东西!

于 2013-09-06T01:59:03.573 回答
0

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

var_dump(is_numeric(0));

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

于 2013-09-06T01:53:21.143 回答
0
elseif (!is_numeric(POST[$_'$away_score']) && !is_null(POST[$_'$away_score']))

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

于 2013-09-06T01:53:49.440 回答