不确定我是否没有看到任何内容或内容,但我有一个简单的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
?
答案 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()