我应该在哪里使用isset()和!empty()?

129

我在某个地方读到,isset() 函数会将空字符串视为 TRUE,因此 isset() 不是验证来自 HTML 表单的文本输入和文本框的有效方法。

所以你可以使用 empty() 来检查用户是否输入了内容。

  1. isset() 函数将空字符串视为 TRUE 是真的吗?

  2. 那么在哪些情况下应该使用 isset()?我是否应该始终使用 !empty() 来检查是否有内容?

例如,使用

if(isset($_GET['gender']))...

使用这个

if(!empty($_GET['gender']))...

可能是为什么要同时检查isset()和!empty()的重复问题。 - Gajus
20个回答

157
isset()函数用于检查变量是否有值,包括False、0或空字符串,但不包括NULL。如果变量存在且不为NULL,则返回TRUE;否则返回FALSE。
empty()函数与isset()相反(即!isset()),并额外检查一个值是否为空,包括空字符串、0、NULL、false或空数组或对象。如果变量已设置且具有非空且非零的值,则返回FALSE;否则返回TRUE。

75
好的,我会尽力进行翻译。以下是需要翻译的内容:FTA: From the Article - Jianxin Gao
8
empty()函数对于一个空数组也会返回true。 - Mitya
1
即使 empty() 对于 0 返回 TRUE,但在数学运算中使用此操作符并不是一个好主意,因为 "0" 可能会被错误地解释为字符串,这可能是危险的。相反,应该使用基本的 >, <== 操作符,并使用 intval()floatval() 转换变量。 - kaleazy

41
以最一般的方式:
  • isset用于测试变量(或数组元素,或对象属性)是否存在(且不为null)
  • empty用于测试变量是否未设置或包含空值。
回答问题1
$str = '';
var_dump(isset($str));

提供

boolean true

因为变量 $str 存在。
而且问题2
你应该使用 isset 来确定一个变量是否存在;例如,如果你从一个数组中获取一些数据,你可能需要检查该数组中的某个键是否已设置(并且其值不为空)。 考虑一下 $_GET / $_POST,例如。
如果你想知道一个变量是否存在非空,那就是 empty 的工作。

12

isset仅用于变量而非值,因此isset("foobar")将会报错。从PHP 5.5开始,empty支持变量和表达式。

所以您的第一个问题应该是如果isset对于保存空字符串的变量返回 true 吗?答案是:

$var = "";
var_dump(isset($var));

PHP手册中的类型比较表格对于这类问题非常方便。

isset基本上检查变量是否有任何值,除了null以外,因为不存在的变量始终具有值null。而empty则是isset的对应部分,但也将整数值0和字符串值"0"视为空。(再次查看类型比较表格。)


1
请注意,自 PHP 5.5.0 起,empty() 还“支持表达式,而不仅仅是变量”。 - ComFreek

12

这两种方法都不是检查有效输入的好方式。

  • isset() 不足以判断有效性,因为正如已经注意到的那样,它认为空字符串是一个有效值。
  • ! empty() 也不足以判断有效性,因为它会拒绝 '0',而 '0' 可能是一个有效值。

使用 isset() 结合对空字符串进行相等性检查是你需要的最基本的验证方法,以避免产生错误的负面结果:

if( isset($_GET['gender']) and ($_GET['gender'] !== '') )
{
  ...
}

但是,我所说的“最低限度”就是指这样。以上的代码只是确定是否有一个$_GET['gender']的值。它并不确定$_GET['gender']的值是否有效(例如,是否为有效值之一,如("男性","女性","文件未找到"))。
要了解更多信息,请参阅Josh Davis的回答

2
由于您使用了宽松比较,当处理零值或假值的非字符串类型时,您建议的代码片段将会产生误报。https://3v4l.org/aIWqA - mickmackusa

10

如果你有一个 $_POST['param'],并且假设它是字符串类型的话

isset($_POST['param']) && $_POST['param'] != ''

与...相同

!empty($_POST['param'])

5

isset() vs empty() vs is_null()

enter image description here


5

何时和如何使用:

  1. isset()

对于0、1、空字符串、包含值的字符串、true和false返回True

对于null和未定义的变量返回False

e.g

$status = 0
if (isset($status)) // True
$status = null 
if (isset($status)) // False
  1. 空的

对于1,一个包含值的字符串,为真

对于未定义的值,null,空字符串,0,false,为真 例如:

$status = 0
if(empty($status)) // true
$status = 1
if(empty($status)) // False

4

isset()不是验证HTML表单中文本输入和文本框的有效方法。

您可以将其重写为"isset()不是一种验证输入的方法。"要验证输入,请使用PHP的filter扩展filter_has_var()将告诉您变量是否存在,而filter_input()将实际过滤和/或清理输入。

请注意,您不必在filter_input()之前使用filter_has_var(),如果您请求未设置的变量,则filter_input()将简单返回null


2

isset用于确定是否存在某个实例,即是否已经实例化了一个变量...它不关心参数的值...

Pascal MARTIN... +1 ...

如果变量不存在,empty()不会生成警告...因此,在测试变量是否存在并打算修改它时,建议使用isset()...


2

isset()用于检查变量是否设置了值,而Empty()用于检查给定的变量是否为空。

当变量不为null时,isset()返回true,而当变量为空字符串时,Empty()返回true。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接