如何检查 PHP 会话是否为空?

50
这是不好的实践吗?
if ($_SESSION['something'] == '')
{
    echo 'the session is empty';
}

有没有一种方法可以检查它是否为空或未设置?我现在正在这样做:

if (($_SESSION['something'] == '') || (!isset($_SESSION['something'])) {
    echo 'the session is either empty or doesn\'t exist';
}

!isset仅检查$_SESSION['']是否存在,而不检查数组中是否有值。

7个回答

113

我会使用 issetempty

session_start();
if(isset($_SESSION['blah']) && !empty($_SESSION['blah'])) {
   echo 'Set and not empty, and no undefined index error!';
}

array_key_exists 是使用 isset 进行键检查的一个好的替代选择:

session_start();
if(array_key_exists('blah',$_SESSION) && !empty($_SESSION['blah'])) {
    echo 'Set and not empty, and no undefined index error!';
}

在从会话数组中读取或写入数据之前,请确保调用了session_start


9
如果您已经使用了empty,就不需要再使用isset。empty也会检查变量是否存在,即不为null/undefined。 - knittl
6
确保在测试变量是否为空之前,实际上拥有该变量是一种好的做法。 - random
2
@knittl - 但是这样我们就不知道它是否已经被设置,无论它是未设置还是为空,都会返回true。我倾向于使用上述方法,但并不总是需要。 - karim79
4
如果不存在、为 null、为空字符串或空数组,empty 返回 false。但为什么还需要检查 isset?请阅读帮助文件:http://ca.php.net/empty - Patrick Desjardins
3
@random 这不是一个好的实践!它只是多余的。请参考https://dev59.com/pG455IYBdhLWcg3wD_2Z - Adam
显示剩余7条评论

12

在访问不确定存在的变量之前,请使用 issetempty 或者 array_key_exists(特别是对于数组键)。因此请修改你第二个示例中的顺序:

if (!isset($_SESSION['something']) || $_SESSION['something'] == '')

6

20
"empty" 很危险,因为它还会将 false、0 和 "0" 報告為空。 - OIS

4
您可以使用count()函数来查看$_SESSION数组中有多少条目。这不是一个好的做法。相反,您应该设置用户的ID(或类似的东西)来检查会话是否已初始化。
if( !isset($_SESSION['uid']) )
    die( "Login required." );

(假设您想检查某人是否已登录)
假设您需要检查用户是否已登录。

4
如果您想检查会话是否可用,您可能需要使用session_id()函数:
session_id()函数返回当前会话的会话ID或空字符串(“”),如果不存在当前会话ID,则返回空字符串。

0
if(isset($_SESSION))
{}
else
{}

0

我知道这已经过时了,但我遇到了一个问题,即在检查是否存在会话后运行函数。每次在注销后尝试加载页面时,它都会抛出错误,但仍然可以正常工作,只是记录了一个错误页面。如果您遇到相同的问题,请确保使用exit();。

     function sessionexists(){
        if(!empty($_SESSION)){
     return true;
         }else{
     return false;
         }
      }


        if (!sessionexists()){
           redirect("https://www.yoursite.com/");
           exit();
           }else{call_user_func('check_the_page');
         } 

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