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


105

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

因此,您可以empty()用来检查用户是否键入了某些内容。

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

  2. 那我应该在什么情况下使用isset()呢?我应该经常!empty()检查是否有东西吗?

例如代替

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

使用这个

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

Answers:


135

isset vs.!empty

自由贸易协定:

“ isset()检查变量是否具有包含(False,0或空字符串)但不为NULL的值。如果var存在,则返回TRUE;否则返回FALSE。

另一方面,empty()函数检查变量是否具有空值,空字符串,0,NULL或False。如果var具有非空且非零值,则返回FALSE。”


47
自由贸易协定:摘自文章
高建新

5
empty()对于空数组也返回true。
Mitya

即使tho empty()为0返回TRUE,在万一“ 0”偶然是一个字符串的情况下,使用此运算符进行数学运算也不是一个好主意。这可能很危险。相反,使用基本><==运营商和转换变量使用intval()floatval()
kaleazy

32

以最一般的方式:

  • isset 测试变量(或数组的元素,还是对象的属性) 存在(并且不为null)
  • empty 测试变量(...)是否包含一些非空数据。


要回答问题1

$str = '';
var_dump(isset($str));

boolean true

因为变量 $str存在。


问题2

您应该使用isset来确定变量是否存在;例如,如果要获取一些数据作为数组,则可能需要检查是否在该数组中设置了键。 例如,
考虑$_GET/ $_POST

现在,要发挥其价值,当您知道有这样的价值时:这就是的工作empty


11

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

  • isset() 这是不够的,因为(如前所述)它将空字符串视为有效值。
  • ! empty() 还不够,因为它拒绝可能为有效值的“ 0”。

使用isset()与对空字符串相等性检查相结合是最起码的,你需要验证传入的参数有没有产生假阴性值:

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

但是,“最低限度”是我的意思。上面的代码所做的全部工作就是确定是否有的值$_GET['gender']。它并没有确定的值是否$_GET['gender']有效的(例如,一个)。("Male", "Female","FileNotFound")

为此,请参见Josh Davis的答案


由于您使用的是松散比较,因此建议的代码段在处理零位/假值非字符串值时会给出误报。 3v4l.org/aIWqA
mickmackusa

11

isset仅用于变量,而不仅用于值,因此isset("foobar")会引发错误。从PHP 5.5开始,同时empty支持变量和表达式。

因此,您的第一个问题应该是是否对包含空字符串的变量isset返回true。答案是:

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

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

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


1
请注意,empty()从PHP 5.5.0开始,“ 还支持表达式,而不只是变量”。
ComFreek 2013年

8

如果您有$ _POST ['param']并假定它是字符串类型,则

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

等同于

!empty($_POST['param'])

4

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

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

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


3

何时以及如何使用:

  1. isset()

为0,1,空字符串,其中包含一个值的字符串,真,假

为空

例如

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

False表示1,一个包含值的字符串,true

True为null,空字符串,0,false,例如

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

2

isset用于确定某事物的实例是否存在,即是否实例化了一个变量...它与参数的值无关...

Pascal MARTIN ... +1 ...

如果变量不存在,empty()不会生成警告...因此,当您打算修改变量时测试是否存在变量时,首选使用isset()。


1

使用empty就足够了:

if(!empty($variable)){
    // Do stuff
}

另外,如果您想要一个整数值,也可能值得检查一下intval($variable) !== FALSE


2
另外,intval()绝不会返回FALSE。
乔什·戴维斯

1
它还不够,因为'0'是有效的字符串,但对于empty... isset/ 则无效,filter_has_var必须使用它来检查var是否存在。
Yousha Aleayoub

1
isset($variable) === (@$variable !== null)
empty($variable) === (@$variable == false)

1

我来这里是为了寻找一种快速的方法来检查变量中是否包含任何内容。这里没有答案提供完整的解决方案,所以这里是:


检查输入是否为''或足够了null,因为:

请求网址.../test.php?var=结果$_GET['var'] = ''

请求网址.../test.php结果$_GET['var'] = null


isset()false仅在变量存在且未设置为时返回null,因此,如果使用它,则会得到true空字符串('')。

empty()同时考虑null''空的,但它也认为'0'空,这在一些使用情况的问题。

如果要'0'视为空,请使用empty()。否则,请使用以下检查:

$var .'' !== ''计算结果为false只对以下输入:

  • ''
  • null
  • false

我使用以下检查也只过滤掉带有空格和换行符的字符串:

function hasContent($var){
    return trim($var .'') !== '';
}

0

我使用以下方法来避免发出通知,这将检查是否在GET或POST上声明了该变量,并使用@前缀可以安全地检查是否不为空,并避免在未设置var的情况下发出通知:

if( isset($_GET['var']) && @$_GET['var']!='' ){
    //Is not empty, do something
}

@不应该鼓励使用“ stfu运算符”(),并且对于您的代码段来说也没有必要。这不是一个好答案。您正在做一个粗略的比较。您不妨使用!empty()
mickmackusa

1
糟糕,这对于不良的编码示例非常有用。@会给您带来调试方面的麻烦,页面影响会变慢,并且您error_log一瞬间仍然可以拥有超过1GB的内存。只是聪明和使用!empty()!is_null()或者类似的东西。
Ivijan StefanStipić,19年

0

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

如果变量不为null,则isset()返回true;如果变量为空字符串,则Empty()返回true。


0
    $var = '';
// Evaluates to true because $var is empty
if ( empty($var) ) {
echo '$var is either 0, empty, or not set at all';
}
// Evaluates as true because $var is set
if ( isset($var) ) {
 echo '$var is set even though it is empty';
    }

资料来源:Php.net




0

!empty可以解决问题。如果只需要检查数据是否存在,则使用isset other empty可以处理其他验证

<?php
$array = [ "name_new" => "print me"];

if (!empty($array['name'])){
   echo $array['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array2 = [ "name" => NULL];

if (!empty($array2['name'])){
   echo $array2['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array3 = [ "name" => ""];

if (!empty($array3['name'])){
   echo $array3['name'];
}

//output : {nothing}  

////////////////////////////////////////////////////////////////////

$array4 = [1,2];

if (!empty($array4['name'])){
   echo $array4['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array5 = [];

if (!empty($array5['name'])){
   echo $array5['name'];
}

//output : {nothing}

?>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.