此处,$username
是用户输入,我正在尝试检查该条目是用户名还是用户ID(所有整数)
我想使用intval函数来查看$username
和intval($username)
是否相同,这意味着输入是用户ID。
我提供的输入是google
。并且intval('google')
为0.为什么if语句的真实部分会被执行?有什么想法吗?
我不使用===
,因为userinput将是一个字符串。
if($username == intval($username))
{
echo "userid";
}
else
{
echo "username";
}
不确定为什么会发生意外行为。
答案 0 :(得分:3)
这是因为conversion
& type juggling
比较运算符。
intval('anystring')
将为0
。
当比较string
时,它也会转换为数值。因此,当转换字符串时,它也将是0
。
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。这些规则也适用于switch语句。当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。
因此,在这种情况下,'google1' == intval('google')
将是0 == 0
,这是真的。对于此类比较,请始终使用相同(===)比较。
答案 1 :(得分:2)
这是因为类型杂耍 来自Comparison Operators上的PHP手册:
与各种类型的比较
Type of Operand 1 | Type of Operand 2 | Result ---------------------------------------------------------------------------------------------------------------- string, resource or number | string, resource or number | Translate strings and resources to numbers, usual math
由于一个操作数是数字而一个是字符串,因此字符串将转换为数字,从而有效地使您的检查等效于:
if(intval($username) == intval($username))
现在,如何解决这个问题:
is_int
无法正常工作,因为它会检查变量的类型,而is_numeric
会排序工作,对于小数也会返回true,例如123.456
,可能不是你想要的。
我能想到的唯一真正的解决方案是将结果整数转换回字符串:
if($username === strval(intval($username)))