2012-07-21 58 views
2

当检查超全局像$_GET$_POST是否存在特定键的值时,是否有一种方法以更简洁的方式包含以下功能?PHP:无效值检查

if (isset($_POST['foo']) && $_POST['foo'] !== '') { 
    // ... 
} 

isset()函数本身返回TRUE即使值是一个空字符串'',所以我不能使用。

仅使用$_POST['foo'] !== ''本身就能正常工作,但对于未定义的索引它会发出E_NOTICE,这是不可取的。

empty()函数为"0"返回TRUE,这是一个有效的值,所以我也不能使用它。

我是否错过了一些明显的东西,或者这真的是最好的/唯一的方法吗?

回答

5

也许你正在寻找array_key_exists()

if (array_key_exists('foo', $_POST)){ 
    // will execute when $_POST['foo'] is set, even if to null, false, '' etc. 
}; 

如果你不想匹配空字符串(''),那么您的解决方案可能是不够的。以上解决方案仅在密钥不存在时才会给您false

+0

我相信这会起作用,因为'$ _POST'值永远不能是'NULL','FALSE'等(对吧?)。我的意思是,除非有人压倒它,那就是。 – FtDRbwLXw6 2012-07-21 02:35:16

2

你可以一直沉默E_NOTICE。在这种情况下,如果未设置变量(实际上,这是唯一可能的错误条件),则预计会抛出E_NOTICE,因此可以安全地进行沉默。

if(@$_POST['foo'] != '') { 

} 
+0

我不同意“_it是唯一可能的错误条件here_”。有人可能会覆盖'$ _POST'变量,您可能会遇到相当广泛的错误,包括例如。致命错误:http://ideone.com/3DkzZ。不要使用沉默操作符(http://stackoverflow.com/a/11588901/548696),如果有人使用它 - 请随时使用[_scream_ extension](http://php.net/manual/en/book .scream.php)。 – Tadeck 2012-07-21 02:12:32

+3

@Tadeck:在比较中(即:**在这个特定情况下**),不存在其他可能的错误情况。你给出的例子不是比较。虽然我同意通常不应使用沉默操作符,但这是可以安全使用的一种情况**。 – 2012-07-21 02:21:08

1

为什么不整后在脚本的开始使用array_merge一杆。

$default = array('foo' => "2", 'bar' => 'Hello World'); 
$postValues = array_merge($default, $POST); 

然后使用$postValues。它会在代码的其余部分随处获得isset,因为将使用默认值。

+0

我花了几分钟的时间才明白这将如何适用于我的问题。基本上,我需要为所有可能的参数定义一个只有NULL值的'$ default'数组。然后我可以使用'$ postValues ['foo']!=='''方法,因为'foo'保证总是被设置,并且因为'NULL!==''',它会完成我想要的。 – FtDRbwLXw6 2012-07-21 02:33:49

+0

@drrchknlsn - 更好 - 你也可以放入其他默认值。 – 2012-07-21 02:38:23