检查$ _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)) {}
要检查属性是否设置(属性是否存在,值是否为null
或false
),请使用:
if (isset($_POST['userName'])) {}
要检查属性是否设置为非空(不是空string, 0
(整数), 0.0
(浮点), '0'
(string), null
, false
或[]
(空数组)),请使用:
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任何评估为true或false的东西。 空数组计算结果为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';
这实现了一个检查$_POST
variables是否被设置。 在访问它之前。
isset正在testing您在哈希(或关联数组)中检查的密钥是否“设置”。 在这个背景下设置就意味着它知道价值。 没有什么是价值。 所以它被定义为一个空string。
出于这个原因,只要你有一个名为userName的input字段,不pipe是否填写,这将是真实的。 你真正想要做的是检查userName是否等于一个空string''