2012-04-10 64 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(); 
     } 
    } 
相關問題