Я пытаюсь выполнить базовую операцию: проверить, является ли строка числом.
Это не работает:
$qty = $_REQUEST[qty]; if (is_int($qty) == FALSE) { echo "error"; } else { echo "ok"; }
Это делает:
$qty = 1; if (is_int($qty) == FALSE) { echo "error"; } else { echo "ok"; }
$_REQUEST[qty]
отправляется с запросом AJAX ($.post). $_REQUEST[qty]
($.post). $_REQUEST[qty]
НЕ пусто и содержит только число (1).
is_numeric()
не будет работать, поскольку он обрабатывает 1e4
как число.
is_int возвращает только true, если переменная имеет целочисленный тип. если вы пытаетесь проверить, содержит ли переменная строку, представляющую число, используйте:
is_numeric("1");
источник: http://php.net/manual/en/function.is-int.php
РЕДАКТИРОВАТЬ:
используйте ctype_digit () для проверки каждого символа в строке, если это число, чтобы исключить «1e4»,
Если вы хотите проверить наличие цифр только, вы можете использовать ctype_digit .
попробуйте «is_numeric ()» вместо «is_int» …
Я думаю, что ур получает строку из вашего запроса … и is_int действительно проверяет, имеет ли данный объект целое число … Но это не -> это строка.
is_numeric просто проверяет, может ли объект преобразовываться в целое число. Если это так, он возвращает true, иначе false …
$qty = $_REQUEST[qty]; if (is_numeric($qty) == FALSE) { echo "error"; } else { echo "ok"; }
PS: используйте $ _POST [] или $ _GET [] вставить $ _REQUEST [];)
Вы говорите, что вы не можете использовать is_numeric
потому что он рассматривает 1e4
как число. Ну, 1e4
– число. В частности, 1 * 10^4
.
Вы можете использовать is_int(intval($_REQUEST['qty']))
, но поскольку intval
всегда возвращает int (0 при сбое или пустой ввод), вы рискуете ложными срабатываниями. Однако в сочетании с is_numeric
или filter_var
вы должны быть на довольно солидной основе.
Фактически, все значения $ _REQUEST (а также $ _GET, $ _POST и т. Д.) Всегда являются строками .
Когда $qty
$_REQUEST[qty]
, это строка, а не целое число. Когда $qty
равно 1
, это уже целое число.
Используйте функцию intval
чтобы преобразовать ее в целое число. Но, как вы говорите, вы только хотите узнать, является ли это целым числом или нет, поэтому используйте floatval
для его преобразования, а затем проверьте, равны ли они:
if (intval($qty) == floatval($qty)) { echo "Ok!"; } else { echo "error"; }
Делайте не идентичные сравнения Docs при использовании строкового и целочисленного акта:
if ($qty !== (string)(int)$qty) { echo "error"; } else { echo "ok"; }
Это в основном буквально: поскольку все входящие переменные являются строками, вы не можете проверить, что они являются целыми числами, если только вы не передаете их целому числу, а затем вернитесь к строке. Оберните его в функцию, если трудно понять встроенный код, что он делает:
/** * string is integer value? * * @return bool */ function is_int_string($string) { return $string === (string)(int)$string; } $qty = $_REQUEST[qty]; if (is_int_string($qty) == FALSE) { echo "error"; } else { echo "ok"; }
HTTP – это текстовый протокол, поэтому в начале есть только строка.
Я решил пойти с preg_match ().
if (!preg_match("/^[0-9]+$/", $_REQUEST[qty])) {}