Есть ли лучший способ сделать это?
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.
Это не дубликат проверки того, является ли переменная целой в PHP , потому что мои требования / определения целого отличаются от theres.
Попробуйте ctype_digit
if (!ctype_digit($_POST['id'])) { // contains non numeric characters }
Примечание. Он будет работать только со string
типами. Таким образом, вы должны использовать для string
переменных:
$var = 42; $is_digit = ctype_digit((string)$var);
Также обратите внимание: он не работает с отрицательными целыми числами. Если вам это нужно, вам придется идти с регулярным выражением. Я нашел это, например:
EDIT: Благодаря 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
! См. Таблицу сравнений типов для этого.
$var = 'php'; var_dump($var != (int)$var); // false $var = '0'; var_dump($var !== (int)$var); // true
попробуйте функцию filter_var
filter_var($_POST['id'], FILTER_VALIDATE_INT);
использовать:
if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) { //Doing somethings... }
В значениях PHP $_POST
всегда есть текст (тип string
).
Вы можете принудительно ввести переменную в целочисленный тип следующим образом:
$int_id = (int)$_POST['id'];
Это будет работать, если вы уверены, что $_POST['id']
должен быть целым числом. Но если вы хотите сделать абсолютно уверенным, что он содержит только числа от 0
до 9
и никакие другие знаки или символы не используются:
if( ctype_digit( $_POST['id'] ) ) { $int_id = (int)$_POST['id']; }
Проверьте это: 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
возвращал true
Также имейте в виду, что ctype_digit
не скажет вам, может ли строка быть фактически преобразована в действительный int
поскольку максимальное целочисленное значение – PHP_INT_MAX
; Если ваше значение больше этого, вы все равно получите PHP_INT_MAX
.
preg_match('/^\d+$/D',$variable) //edit
если вы знаете, что это строковая переменная (например, post o get values), вы можете использовать:
function is_really_integer($var) { return $var == (string)(integer)$var; }
Принимаемый ответ с использованием 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; }
Используйте следующую универсальную функцию для проверки всех типов:
function is_digit($mixed) { if(is_int($mixed)) { return true; } elseif(is_string($mixed)) { return ctype_digit($mixed); } return false; }
Я использую:
is_int($val)||ctype_digit($val)
Обратите внимание, что этот catch только положительные целые строки
Использование 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 ✔
is_int отлично работает, нет необходимости в дополнительном коде
или вы можете проверить использование is_numeric