Intval的意外行为

时间:2015-06-25 12:57:36

标签: php

此处,$username是用户输入,我正在尝试检查该条目是用户名还是用户ID(所有整数)

我想使用intval函数来查看$usernameintval($username)是否相同,这意味着输入是用户ID。

我提供的输入是google。并且intval('google')为0.为什么if语句的真实部分会被执行?有什么想法吗?

我不使用===,因为userinput将是一个字符串。

if($username == intval($username))
    {
     echo "userid";
    }
    else
    {
    echo "username";
    }

不确定为什么会发生意外行为。

2 个答案:

答案 0 :(得分:3)

这是因为conversion& type juggling比较运算符。

intval('anystring')将为0

当比较string时,它也会转换为数值。因此,当转换字符串时,它也将是0

  

如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。这些规则也适用于switch语句。当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。

因此,在这种情况下,'google1' == intval('google')将是0 == 0,这是真的。对于此类比较,请始终使用相同(===)比较。

comparison

答案 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)))