验证$_REQUEST内容是否是int类型


Validating whether $_REQUEST contents is an int

我想做一个基本的操作:检查字符串是否是一个数字。

这行不通:

$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]不是空的,只包含数字(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 [] insetead $ _REQUEST [];)

您提到您不能使用is_numeric,因为它将1e4视为数字。1e4是一个数字。特别是1 * 10^4 .

您可以使用is_int(intval($_REQUEST['qty'])),但由于intval总是返回int(失败时为0或空输入),因此您有误报的风险。但是,结合is_numericfilter_var,您应该有相当坚实的基础。

实际上,所有的$_REQUEST(以及$_GET, $_POST等)值始终是字符串

$qty$_REQUEST[qty]时,它是字符串,而不是整数。当$qty1时,它已经是一个整数。

使用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])) {}