如何验证PHP中的无符号数?

时间:2011-04-03 10:28:31

标签: php validation

我不知道如何处理这个,我已经尝试过对我来说最明显的解决方案,但到目前为止还没有一个证明完全令人满意。我必须忽视一些非常简单的事情。

我有一个输入类型为text的表单:

<input type="text" name="album_id">

我想验证输入,因此用户只输入无符号整数...

$required = array(); // required or invalid input

$tmp = trim($_POST['album_id']);

if (!is_int((int)$tmp)) {
   $required['album'] = 'The album id must contain a positive numeric value only.';
}

到目前为止,我已经使用!is_numeric($tmp),但是用户可以输入9.2或“1e4”,它将验证...以便一个不起作用。

我也试过!is_int((int)$tmp)但是由于某种原因,那个不起作用(也许它应该但我做错了......)。 我试过ctype_digit没有成功。 我可能忽略了一些但不确定是什么。

如何在php中验证无符号数?没有浮点数,负数等......只是一个简单的无符号数(1到n)。

4 个答案:

答案 0 :(得分:7)

如果你想检查一些变量是否只包含数字(这似乎是你想要的,在这里),你可能必须使用ctype_digit()


不确定你尝试了什么,但这样的事情应该有效:

$tmp = trim($_POST['album_id']);
if (ctype_digit($tmp)) {
    // $tmp only contains digits
}

答案 1 :(得分:4)

filter_var()功能是这里工作的正确工具。

这是一个只对无符号整数或无符号整数字符串返回非假的过滤器:

$filteredVal = filter_var($inputVal, 
                          FILTER_VALIDATE_INT, 
                          array('options' => array('min_range' => 0)));

这是documentation on filters

示例:

<?php

$testInput = array(
            "zero string" => "0",
            "zero" => 0,
            "int" => 111,
            "string decimal" => "222",
            "empty string" => "",
            "false" => false,
            "negative int" => -333,
            "negative string decimal" => "-444",
            "string octal" => "0555",
            "string hex" => "0x666", 
            "float" => 0.777,
            "string float" => "0.888",
            "string" => "nine"
         ); 

foreach ($testInput as $case => $inputVal)
{
    $filteredVal = filter_var($inputVal, 
                              FILTER_VALIDATE_INT, 
                              array('options' => array('min_range' => 0)));

    if (false === $filteredVal)
    {
        print "$case (". var_export($inputVal, true) . ") fails\n";
    } 
    else
    { 
        print "$case (". var_export($filteredVal, true) . ") passes\n";
    }
}

输出:

zero string (0) passes
zero (0) passes
int (111) passes
string decimal (222) passes
empty string ('') fails
false (false) fails
negative int (-333) fails
negative string decimal ('-444') fails
string octal ('0555') fails
string hex ('0x666') fails
float (0.777) fails
string float ('0.888') fails
string ('nine') fails

答案 2 :(得分:1)

您可以使用preg_match()

if(preg_match('/^[\\d+]$/', $tmp) == 0)
    $required['album'] = 'The album id must ...';

请注意,这不会进行正范围检查(例如,超过整数的最大有效值)。

编辑: 使用Pascal MARTIN的解决方案,除非您想要进行更复杂的检查(例如需要其他特殊字符),因为我猜它可以提供更好的性能。

答案 3 :(得分:1)

if (preg_match('!^[1-9][0-9]*$!',$tmp)) {