2011-01-08 107 views
0
is_int($_GET['pid']) ? define(PRODUCT, $_GET['pid']) : die('Invalid Product Id'); 

即使pid的值是整数,我仍然会收到无效的产品ID消息。为什么?这个简单的PHP代码有什么问题?

+0

你可以在例子中看到:`var_dump(is_int (“23”));`打印`布尔(假)`。并实际回答你的问题:你的代码没有问题。只有(imo)是你不应该用这种方式使用三元运算符。如果您实际分配了一个值,您应该只使用它(再次:imo)。 – 2011-01-08 20:04:36

+4

不是答案,只是建议:不要使用三元运算符`::`来控制流程(执行一条语句或另一条语句)。它的意思是用作表达式,例如`x =(y> 5?'high':'low')`。在这种情况下,使用`if(...){...} else {...}`。 – 2011-01-08 20:05:36

回答

4

manual这样说:要测试一个变量是一个数字还是一个数字字符串(例如表单输入,它总是一个字符串),您必须使用is_numeric()

编辑:虽然这是我的答案暗示在这里,但我会更具体:$_GET的内容是字符串,所以is_int调用将始终返回false。如果您真的想在此验证的是某个字符串的内容代表 整数 数字,您可以使用致电is_numeric

+2

“...以验证...特定字符串的内容代表整数,您可以使用对is_numeric的调用。”不可以。您可以使用_is_numeric()_仅验证它是一个数字,而不是一个整数。见克里斯的答案。 – GZipp 2011-01-08 20:24:16

1

$_GET[]总是返回字符串,所以is_int()总是计算为false。改为尝试is_numeric()

1

$_GET中的任何内容都是字符串,并且is_int("2")返回false

2

$ _GET数组中的值通常是字符串类型,但有时也是类型数组。

使用ctype_digit()检查一个字符串是否完全是数字字符。可选地,首先修剪()字符串。如果你想接受有时被数值解释的各种格式的字符串,比如小数点,科学记数法,十六进制字符串等,只能使用is_numeric()...