有更好的方法吗?
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_int()
,似乎是
is_int('23'); // would return false (not what I want)
is_int(23); // would return true
我也试过is_numeric()
is_numeric('23'); // return true
is_numeric(23); // return true
is_numeric('23.3'); // also returns true (not what I want)
似乎这样做的唯一方法是: [这是一种不好的方式,不要这样做,请参阅下面的注释]
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。 (感谢redreggae)
$var = 'hello';
if( $var != (integer)$var )
echo 'not a integer';
// will return true! So this doesn't work either.
这不是Checking if a variable is an integer in PHP的副本,因为我的整数要求/定义与theres不同。
答案 0 :(得分:53)
if (!ctype_digit($_POST['id'])) {
// contains non numeric characters
}
注意:它仅适用于string
类型。所以你必须转换为string
你的正常变量:
$var = 42;
$is_digit = ctype_digit((string)$var);
另请注意:它不适用于负整数。如果你需要这个,你必须使用正则表达式。我找到this例如:
编辑:感谢LajosVeres,我添加了D修饰符。因此123\n
无效。
if (preg_match("/^-?[1-9][0-9]*$/D", $_POST['id'])) {
echo 'String is a positive or negative integer.';
}
更多:使用强制转换的简单测试不起作用,因为“php”== 0是true
而“0”=== 0是false
!
请参阅types comparisons table。
$var = 'php';
var_dump($var != (int)$var); // false
$var = '0';
var_dump($var !== (int)$var); // true
答案 1 :(得分:15)
尝试filter_var
功能
filter_var($_POST['id'], FILTER_VALIDATE_INT);
使用:
if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) {
//Doing somethings...
}
答案 2 :(得分:8)
在PHP $_POST
中,值始终是文本(string
类型)。
您可以将变量强制转换为整数类型,如下所示:
$int_id = (int)$_POST['id'];
如果您确定$_POST['id']
应该一个整数,那么这将有效。但是,如果您想要确保它只包含0
到9
中的数字,并且没有其他符号或符号使用:
if( ctype_digit( $_POST['id'] ) )
{
$int_id = (int)$_POST['id'];
}
答案 3 :(得分:2)
检查出来:http://php.net/manual/en/function.ctype-digit.php - 它验证字符串是否只包含数字,所以一定不要将int传递给该函数,因为它很可能会返回false;但是,来自$_POST
的所有值都是字符串,因此您是安全的。此外,它不会验证负数,例如-18
,因为-
不是数字,但您始终可以ctype_digit(ltrim($number, '-'))
is_int
检查变量类型,在您的情况下为string
;它与(integer)$v === $v
相同,因为==
做了一些真实的模糊事物,以便比较不同类型的两个变量;你应该总是使用===
,除非你想要"0af5gbd" == 0
之类的混乱才能返回真实的
另外,请记住,ctype_digit
不会告诉您字符串是否可以实际转换为有效int
,因为最大整数值为PHP_INT_MAX
;如果您的值大于此值,则无论如何都会得到PHP_INT_MAX
。
答案 4 :(得分:2)
preg_match('/^\d+$/D',$variable) //edit
答案 5 :(得分:1)
如果你知道它是一个字符串变量(比如post o get values),你可以使用:
function is_really_integer($var) {
return $var == (string)(integer)$var;
}
答案 6 :(得分:1)
使用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;
}
答案 7 :(得分:1)
使用is_numeric()
检查变量是否为整数是一个坏主意。
例如,此函数将为TRUE
发送3.14
。这不是预期的行为
要正确执行此操作,您可以使用以下选项之一:
考虑这个变量数组:
$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
];
# Check if your variable is an integer
if( ! filter_var($variable, FILTER_VALIDATE_INT) ){
echo "Your variable is not 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 ✔
# Check if your variable is an integer
if ( strval($variable) != strval(intval($variable)) ) {
echo "Your variable is not 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 ✔
# Check if your variable is an integer
if( ! ctype_digit(strval($variable)) ){
echo "Your variable is not 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 ✔
# Check if your variable is an integer
if( ! preg_match('/^\d+$/', $variable) ){
echo "Your variable is not 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 ✔
答案 8 :(得分:1)
使用 filter_var ,但要小心,它会返回bool。
如果您使用字符串'0'=>,则将得到假
正确的使用方式:
if (filter_var($_POST['id'], FILTER_VALIDATE_INT) !== false) {
// Doing somethings...
}
答案 9 :(得分:0)
使用以下通用功能检查所有类型:
function is_digit($mixed) {
if(is_int($mixed)) {
return true;
} elseif(is_string($mixed)) {
return ctype_digit($mixed);
}
return false;
}
答案 10 :(得分:0)
我用:
is_int($val)||ctype_digit($val)
注意比这只捕获正整数字符串
答案 11 :(得分:0)
is_int完全正常工作,不需要额外的代码
或者您可以使用is_numeric
进行检查