检查$ _POST-value是否为空

if(isset($_POST['submit'])) { if(!isset($_POST['userName'])) { $username = 'Anonymous'; } else $username = $_POST['userName']; } 

我不能让$username是“匿名”? 它是空的或者$_POST['userName']

如果variables已经初始化, isset()将返回true。 如果您的表单字段的name值设置为userName ,那么当提交表单时,值将始终为“set”,尽pipe可能没有任何数据。

trim()string并testing它的长度

 if("" == trim($_POST['userName'])){ $username = 'Anonymous'; } 

如果表单成功提交,则应始终设置$_POST['userName'] ,虽然它可能包含一个空string,与完全不设置不同。 而是检查它是否为empty()

 if(isset($_POST['submit'])){ if(empty($_POST['userName'])){ $username = 'Anonymous'; } else $username = $_POST['userName']; } 

要检查房产是否存在,无论价值如何,请使用:

 if (array_key_exists('userName', $_POST)) {} 

要检查属性是否设置(属性是否存在,值是否为nullfalse ),请使用:

 if (isset($_POST['userName'])) {} 

要检查属性是否设置为非空(不是空string, 0 (整数), 0.0 (浮点), '0' (string), nullfalse[] (空数组)),请使用:

 if (!empty($_POST['userName'])) {} 

问题:检查$ _POST值是否为

翻译:检查数组键/索引是否有与之相关的值。

答:取决于你对安全的重视程度。 取决于什么是允许的有效input。

 1. Some people say use empty(). 

在PHP手册中:“[Empty]”决定一个variables是否被认为是空的,如果一个variables不存在或者其值等于FALSE,那么这个variables被认为是空的。 以下内容被认为是空的。

 "" (an empty string) 0 (0 as an integer) 0.0 (0 as a float) "0" (0 as a string) NULL FALSE array() (an empty array) $var; (a variable declared, but without a value) 

如果这些值都不适用于您的input控件,则可以使用empty() 。 这里的问题是empty()可能太宽而不能一致地使用(同样的原因,在不同的input控制提交到$_POST$_GET )。 empty()一个很好的用法是检查整个数组是否为空(没有元素)。

 2. Some people say use isset(). 

isset() (一种语言结构)不能在整个数组上运行,如isset($myArray) 。 它只能对variables数组元素 (通过索引/键)进行操作: isset($var)isset($_POST['username'])isset()语言结构做两件事。 首先检查variables或数组索引/键是否有与之相关的值。 其次,它检查以确保值不等于PHP的NULL值。

总之,最准确的检查可以通过isset() ,因为有些input控件在没有选中或者检查的时候甚至没有用$ _POST注册。 我从来不知道提交了PHP NULL值的表单。 我都没有做,所以我使用isset()来检查$_POST键是否没有与之关联的值(并且不是NULL)。 isset()是比empty() 更为严格的空testing (在你的问题的意义上empty()

 3. Some people say just do if($var), if($myArray), or if($myArray['userName']) to determine emptiness. 

您可以在if语句中testing任何评估为truefalse的东西。 空数组计算结果为false,所以没有设置variables。 包含PHP NULL值的variables也计算为false。 不幸的是,在这种情况下,就像使用empty() ,还有很多东西的计算结果为false:1.空string'',零(0),零。零(0.0),string零'0',布尔值假某些空的XML对象。

–Doyle,从PHP 5.3开始

总之,使用isset()并考虑将其与其他testing相结合。 例:

可能无法工作,因为superglobal螺丝,但可以毫无疑问地为其他arrays工作。

 if(is_array($_POST) && !empty($_POST)) { //Now test for your successful controls in $_POST with isset() } 

这也应该工作。

 if(is_array($_POST) && $_POST) { //Now test for your successful controls in $_POST with isset() //Always validate your input. } 

因此,为什么在你确定知道$_POST代表一个数组并且有任何存储在其中的值(许多人没有考虑到的东西)之前,为什么要查找与某个键相关的值呢? 请记住,人们可以将数据发送到您的表单,而无需使用Web浏览器。 你可能有一天到了testing点$_POST只有允许的密钥,但那个对话是另一天。

有用的参考:

PHP手册:typestesting比较表

改变这个:

 if(isset($_POST['submit'])){ if(!(isset($_POST['userName']))){ $username = 'Anonymous'; } else $username = $_POST['userName']; } 

对此:

 if(!empty($_POST['userName'])){ $username = $_POST['userName']; } if(empty($_POST['userName'])){ $username = 'Anonymous'; } 

我会使用一个简单的一行比较这些用例

 $username = trim($_POST['userName'])?:'Anonymous'; 

这是用于确定错误日志logging已closures的用例,所以您不会收到variables未初始化的警告。

这是偏执版本:

 $username = trim(isset($_POST['userName'])?$_POST['userName']:'')?:'Anonymous'; 

这实现了一个检查$_POSTvariables是否被设置。 在访问它之前。

isset正在testing您在哈希(或关联数组)中检查的密钥是否“设置”。 在这个背景下设置就意味着它知道价值。 没有什么是价值。 所以它被定义为一个空string。

出于这个原因,只要你有一个名为userName的input字段,不pipe是否填写,这将是真实的。 你真正想要做的是检查userName是否等于一个空string''