我有一个PHP文件,有时从一个已经开始会话的页面调用,有时从一个没有会话启动的页面调用。因此,当我在这个脚本上有session_start()时,我有时会得到“会话已经开始”的错误消息。为此,我写了以下几行:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

但这次我收到了警告信息:

注意:未定义变量:_SESSION

是否有更好的方法来检查会话是否已经开始?

如果我使用@session_start,它会使事情正常工作,只是关闭警告?


当前回答

在PHP 5.4之前,除了设置一个全局标志,没有其他可靠的方法。

考虑:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

Or:

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

因此,在PHP 5.4之前,您应该设置一个全局布尔值。

其他回答

根据我的实践,在访问$_SESSION[]之前,您需要每次调用session_start来使用脚本。请参阅下面的手册链接。

http://php.net/manual/en/function.session-start.php

至少对我来说,session_start这个名字让人很困惑。session_load可以更清楚。

最后我对状态进行了两次检查。php 5.4 +

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

事实上,现在在这里解释已经太迟了,因为它已经被解决了。 这是我的一个项目的.inc文件,您可以通过选择一道菜并删除/添加或更改订单来配置餐厅的菜单。 我工作的服务器没有实际的版本,所以我让它更灵活。这取决于作者是否愿意使用和尝试。

在PHP 5.3这为我工作:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 

然后你有。如果你不把不放在If语句开始会话将以任何方式开始我不知道为什么。

session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}