php检查变量是否为整数

php检查变量是否为整数,php,html,validation,Php,Html,Validation,有更好的方法吗 if( $_POST['id'] != (integer)$_POST['id'] ) echo 'not a integer'; 我试过了 if( !is_int($_POST['id']) ) 但是由于某些原因,is_int()不起作用 我的表格是这样的 <form method="post"> <input type="text" name="id"> </form> 我还尝试了is\u numeric() 似乎唯一的

有更好的方法吗

if( $_POST['id'] != (integer)$_POST['id'] )
    echo 'not a integer';
我试过了

if( !is_int($_POST['id']) )
但是由于某些原因,
is_int()
不起作用

我的表格是这样的

<form method="post">
   <input type="text" name="id">
</form>
我还尝试了
is\u numeric()

似乎唯一的方法是:[这是一种不好的方法,不要这样做,请参见下面的注释]

if( '23' == (integer)'23' ) // return true
if( 23 == (integer)23 ) // return true
if( 23.3 == (integer)23.3 ) // return false
if( '23.3' == (integer)'23.3') // return false
但是有没有一个函数可以执行上述操作


为了澄清,我想要以下结果

23     // return true
'23'   // return true
22.3   // return false
'23.3' // return false

注意:我刚刚发现我之前提出的解决方案对于所有字符串都将返回true。(谢谢雷德雷盖)



这不是的副本,因为我对integer的要求/定义与之不同。

在PHP
$\u POST
中,值始终是文本(
string
type)

可以将变量强制转换为整数类型,如下所示:

$int_id = (int)$_POST['id'];
如果您确定
$\u POST['id']
应该是一个整数,那么这将起作用。但如果您想绝对确保它只包含从
0
9
的数字,并且不使用其他符号或符号:

if( ctype_digit( $_POST['id'] ) )
{
  $int_id = (int)$_POST['id'];
}
检查:-它验证字符串是否只包含数字,所以确保不要向该函数传递int,因为它很可能返回false;但是,来自
$\u POST
的所有值始终是字符串,因此您是安全的。此外,它不会验证负数,例如
-18
,因为
-
不是数字,但您始终可以执行
ctype_digit(ltrim($number,'-'))

is_int
检查变量类型,在您的情况下,该变量是
字符串
;这与
(integer)$v====$v
相同,因为
==
为了比较不同类型的两个变量而做了一些真正模糊的事情;您应该始终使用
==
,除非希望像
“0af5gbd”==0这样的混乱返回true

另外,请记住,
ctype_digit
不会告诉您字符串是否可以实际转换为有效的
int
,因为最大整数值是
PHP_int_MAX
;如果您的值大于该值,您将得到
PHP\u INT\u MAX

试试看

注意:它仅适用于
string
类型。因此,您必须强制转换为
string
您的正常变量:

$var = 42;
$is_digit = ctype_digit((string)$var);
还要注意:它不适用于负整数。如果你需要这个,你必须用正则表达式。例如,我发现:

编辑:多亏了LajosVeres,我添加了D修饰符。因此
123\n
无效

if (preg_match("/^-?[1-9][0-9]*$/D", $_POST['id'])) {
    echo 'String is a positive or negative integer.';
}
更多:使用casting的简单测试将不起作用,因为“php”==0是
true
,“0”==0是
false
! 看看吧

$var = 'php';
var_dump($var != (int)$var); // false

$var = '0';
var_dump($var !== (int)$var); // true

如果您知道它是一个字符串变量(如post o get值),则可以使用:

function is_really_integer($var) {
  return $var == (string)(integer)$var;
}

尝试
filter\u var
函数

filter_var($_POST['id'], FILTER_VALIDATE_INT);
使用:


使用ctype_digit接受的答案是正确的,但是您可以使用函数简化操作。这会将变量转换为字符串,因此您不必:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }
    if(ctype_digit($x)){
      return true;
    }
    return false;
}
用法:

if (is_num(56)) {
    // its a number
}

if (is_num('56')) {
    // its a number
}
如果也要接受小数,请使用以下命令:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }    
    if (strpos($x,'.')!==false) {      
        if(substr_count($x,'.')>1||strpos($x,'.')<1||strpos($x,'.')>=strlen($x)){
            return false;    
        }
        $x=str_replace('.','',$x);    
    }
    if(ctype_digit($x)){
        return true;
    }  
    return false;
}
函数为_num($x){
如果(!是_字符串($x)){
$x=(字符串)$x;
}    
如果(strpos($x,'.')!==false{
如果(子项计数($x,,)>1 | | strpos($x,,))=strlen($x)){
返回false;
}
$x=str_替换('.','.$x);
}
if(ctype_位($x)){
返回true;
}  
返回false;
}

使用以下通用功能检查所有类型:

function is_digit($mixed) {
    if(is_int($mixed)) {
        return true;
    } elseif(is_string($mixed)) {
        return ctype_digit($mixed);
    }

    return false;
}
我使用:

请注意,使用
is\u numeric()
检查变量是否为整数时,仅捕获正整数字符串是个坏主意。 例如,此功能将为
3.14
发送
TRUE
。这不是预期的行为

要正确执行此操作,可以使用以下选项之一:

考虑到这个变量数组:

$variables = [
    "TEST 0" => 0,
    "TEST 1" => 42,
    "TEST 2" => 4.2,
    "TEST 3" => .42,
    "TEST 4" => 42.,
    "TEST 5" => "42",
    "TEST 6" => "a42",
    "TEST 7" => "42a",
    "TEST 8" => 0x24,
    "TEST 9" => 1337e0
];
第一个选项(过滤器验证方式): 输出:

TEST 0 : 0 (type:integer) is not an integer ✘
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
第二种选择(铸造比较方式): 输出:

TEST 0 : 0 (type:integer) is not an integer ✘
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
第三个选项(CTYPE_数字方式): 输出:

TEST 0 : 0 (type:integer) is not an integer ✘
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
第四种选择(REGEX方式): 输出:

TEST 0 : 0 (type:integer) is not an integer ✘
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔
工作正常,不需要额外的代码


或者,您可以使用使用筛选变量进行检查,但请注意它的返回布尔值

如果您有字符串“0”=>您将得到false

正确使用方法:

if (filter_var($_POST['id'], FILTER_VALIDATE_INT) !== false) { 
    // Doing somethings...
}

试试RegEXP<代码>预匹配('/^[\d]*$/',$variable)==FALSE
为什么需要“验证”?不能只筛选值吗?所以:$input=(int)$\u POST['id']。这将为您提供一个100%的安全整数(或在出现问题时为0),而且处理起来更容易…@Qualcuno我在考虑这个问题,但我想通知用户他们没有键入正确的数字,并且没有为他们更改它。var_dump($\u POST[“id”])如何,这将告诉您数据类型;为什么?假设他/她输入“aaa”,它将变为0,您将以与拒绝输入0相同的方式拒绝它。(因为它是一个id,所以我认为它将大于0)。您只需告诉用户“输入错误”,无需进一步详细说明<代码>$integer=42;ctype_位($integer)将返回falseyes.。如果您使用“normal”变量检查它,而不是$\u GET或$\u POST,则首先将其转换为
字符串
<代码>$is_digit=ctype_digit((字符串)42)@aaron如果正确,则需要输入字符串。幸运的是,对于
$\u POST
值,它们始终是字符串。@GeoffreyHuck嗯,一旦您使用了它们,它们就不是未知的了。。。我认为
ctype\u digit
应该比
is\u numeric
更频繁地使用,后者有一个更令人难忘的名字,但实际上很少是您想要执行的测试。您需要在preg\u匹配中使用D修饰符。它不接受0到数字。使用
ltrim($number,“-”)
是个好主意。但是请记住
--123
将以这种方式工作。不正确:
$\u POST
可以是数组。如果你读了我的问题,你就会明白为什么
是int
是数值的
没有给我正确的值。这就是我做的,而且非常重要