在将整数与字符串进行比较时返回错误的结果

时间:2016-06-21 11:01:27

标签: php if-statement

不确定我是否没有看到任何内容或内容,但我有一个简单的id验证

$id = '2s2';

var_dump($id);
var_dump($id*1);
if ($id != ($id*1) || $id <= 0) {
    die('wrong id');
}
die('here?');

结果:

string '2s2' (length=3)
int 2
here?

如果值为零或更低,它会检查id是否与id multiplied by 1 相同。因为,$id = '2s2;的值不一样(在转储中可以看到)。

为什么这不会回显wrong id

2 个答案:

答案 0 :(得分:6)

我猜你将它乘以1以查看$id是否为数字。在这种情况下,你可以简单地说:

if (!is_numeric($id) || $id <= 0) {
    die('wrong id');
}

答案 1 :(得分:0)

当你比较不同类型的两个变量(并做一些其他操作)时,PHP会执行一个名为Type Juggling的操作。基本上它会尝试在操作之前将两个操作数转换为相同的类型。

在这种情况下,有些反直觉的PHP会将两个操作数转换为整数。 converting a string to integer的规则基本上是#34;从字符串的开头取字符,直到找到非数字并丢弃其余的#34;。

左手$id确实是"2s2",并从非整数部分剥离到"2",然后与右操作数进行比较。右操作数($id*1)基本上通过相同的过程 - 在数学上下文中,PHP被强制将字符串视为整数。

您可以使用严格比较运算符if ($id !== ($id*1)) - 这样您告诉PHP您不希望涉及类型杂耍,结果将如您所料。

还有一种更简单的方法可以测试$id是否为整数:is_int()is_numeric()