2012-04-10 67 views

回答

35

isset通常是检查的预定义变量当前定义的正确方法:

如果您使用的是PHP的版本之前5.4

,通常可以用其诱人的逃脱只是执行下面的代码,但请注意,如果由于某些原因会话被禁用,session_start()仍然会被调用,最终会导致错误和不必要的调试,因为不允许创建$ _SESSION数组。

if(!isset($_SESSION)){session_start();} 
如果你想占检查是否会话被禁用出于某种原因

,你可以禁止该错误消息,设置测试会话变量,并验证它被设置。如果不是,您可以在禁用会话的反应中进行编码。你需要在脚本开始或接近脚本的时候完成所有这些。因此,作为一个例子(作品不同,这取决于错误处理设置):

if(!isset($_SESSION)){session_start();} 
$_SESSION['valid'] = 'valid'; 
if($_SESSION['valid'] != 'valid') 
{ 
    //handle disabled sessions 
} 

但是,如果你正在使用的PHP版本5.4或更高

可以使用session_status()功能,一个更好的选择,因为它会占用会话被禁用并检查会话是否已经存在。

if (session_status() === PHP_SESSION_NONE){session_start();} 

注意的是PHP_SESSION_NONE是一个常数一套由PHP,因此并不需要被包装在引号中。它的计算结果为整数1,但是作为一个专门用于消除对幻数的需求的常量,最好对常数进行测试。

+0

感谢提供解决方案为php <5.4 – Houston 2014-03-19 14:07:39

+0

@nick好吧,我会说你们都发现了一个5.4.16或更可能有一个奇怪的PHP /服务器配置的错误。无论哪种方式,这是很好的kbow他们可能的边缘情况:D – Rooster 2015-11-20 19:01:01

7

许多人只是简单地使用@session_start()来抑制会话已经启动的警告。另一种方法通常是:

if (session_status() === PHP_SESSION_NONE) session_start(); 
1
if (session_id() === "") { session_start(); } 
3

尝试这个条件

if (version_compare(phpversion(), '5.4.0', '<')) { 
if(session_id() == '') { 
    session_start(); 
} }else{ 
if (session_status() == PHP_SESSION_NONE) { 
    session_start(); 
} } 

如果你只是想避免错误,函数 例如之前使用@:

@session_start(); 
+0

您好,欢迎来到SO。您能否编辑您的帖子来解释您的代码的作用以及它如何解决OP的问题?只有代码答案是不鼓励的,并且可能会被删除。 – 2016-06-29 22:59:37

0

检查现有会话开始之前新:

// # if phpversion() is >= 5.4 
    if(phpversion() >= 5.4) { 

    // # check session_status() function for value 'PHP_SESSION_NONE' 
    if(session_status() === PHP_SESSION_NONE) { 
     session_start(); 
    } 

    } else { // # maintain backwards compat. with PHP versions older than 5.4 

     // # if $_SESSION object if NOT set, start a new session! 
     if(!isset($_SESSION)) { 
     session_start(); 
     } 
    } 
相关问题