使用 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 返回 trueundefined
不等于 NULL
NULL 等于 0,我们不是在谈论 undefined。
并且在他使用比 PDO 更高效和性能更高的 MySQLi 时停止谈论 PDO(对于 MySQL 请求)。
@RobotChief 你为什么这么说? (事实)MYSQLI > PDO以上是关于使用 is_numeric 验证表单输入中的整数的主要内容,如果未能解决你的问题,请参考以下文章