web-dev-qa-db-ja.com

かどうか確認する PHP セッションはすでに開始されています

PHPファイルがあります。これは、セッションを開始したページとセッションを開始していないページから呼び出されることがあります。したがって、このスクリプトにsession_start()があると、 "session already started"というエラーメッセージが表示されることがあります。そのために私はこれらの行を入れました:

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

しかし今回は私はこの警告メッセージを得ました:

Notice:未定義の変数:_SESSION

セッションがすでに開始されているかどうかを確認するためのより良い方法はありますか?

私が@session_startを使うなら、それは物事がきちんと動くようにして、ただ警告を黙らせるでしょうか?

423
Logan

PHP> = 5.4.0、PHP 7 のバージョンに推奨される方法

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

参照: http://www.php.net/manual/en/function.session-status.php

PHP <5.4.0 のバージョン

if(session_id() == '') {
    session_start();
}
690
lovelyramos

PHP 5.4.0より前のPHPのバージョンの場合:

if(session_id() == '') {
    // session isn't started
}

ただし、私見、セッションが開始されたかどうかわからない場合は、セッション管理コードをリファクタリングすることを実際に検討する必要があります。

とは言っても、私の意見は主観的なものであり、セッションが開始されたかどうかを知ることが不可能な場合がある状況(その例は以下のコメントで説明されています)があります。

161
Alex

PHP 5.4では session_status() が導入されました。これはsession_id()に頼るよりも信頼性があります。

次のコードを見てください。

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

そのため、セッションが開始されたかどうかを確認するために、PHP 5.4で推奨される方法は次のとおりです。

session_status() == PHP_SESSION_ACTIVE
70
Benjamin

あなたはこれを行うことができます、そしてそれは本当に簡単です。

if (!isset($_SESSION)) session_start();

それが役に立てば幸い :)

35
miyuru

PHP 5.4より前では、グローバルフラグを設定する以外に信頼できる方法を知ることはありません。

検討してください:

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

または

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より前のバージョンでは、グローバルブール値を設定する必要があります。

21
Ryan Yoosefi
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }
21
k.bon

すべてのphpバージョン

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}
10
supersuphot

これをチェックして :

<?php
/**
* @return bool
*/
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();
?>

出典 http://php.net

9
Elshan

session_id() を使用します。設定されていない場合は空の文字列を返します。 $_COOKIEをチェックするよりも信頼性があります。

if (strlen(session_id()) < 1) {
    session_start();
}
6

これはすべてのPHPバージョンで機能するはずです。それはPHPバージョンを決定してから、セッションがPHPバージョンに基づいて開始されているかどうかを確認します。その後、セッションが開始されていない場合は開始します。

function start_session() {
  if(version_compare(phpversion(), "5.4.0") != -1){
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }
  } else {
    if(session_id() == '') {
      session_start();
    }
  }
}
5
Dustin Poissant
if (session_id() === "") { session_start(); }

それが役に立てば幸い !

5
Mahesh Cheliya

あなたがする必要がある唯一のことは:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>
4
user3140580

そのようなソリューションの効率についてはよくわかりませんが、これは作業中のプロジェクトからのものですこれはデフォルトの言語を定義する必要がある場合にも使用されます。

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }
2
Alex Khimich

@は、関数呼び出しの前に、関数呼び出し中に報告される可能性のあるエラーを抑制します。

@の前にsession_startを追加すると、PHPにエラーメッセージを出力しないように指示します。

例えば:

ブラウザに何かを印刷した後にsession_start()を使用するとエラーが発生するため、PHPには「header cannot be sent:started at(line 12)」のようなメッセージが表示されますが、この場合は@session_start()が失敗しますしかし、エラーメッセージは画面に印刷されません。

ファイルを含める前、または新しいページにリダイレクトする前に、exit()関数を使用してください。そうしないと、エラーが発生します。

このコードはすべての場合に使用できます。


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>

1
sangram desai

ページの実行ごとに1回だけsession_start()を呼び出すように、コードを再編成する必要があります。

1
SamT
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

実のところ、解決されたのでここで説明するには今や手遅れです。これは私のプロジェクトの1つの.incファイルで、料理を選択してレストランのメニューを構成し、順序を削除/追加または変更します。私が働いていたサーバーは実際のバージョンを持っていなかったので私はそれをもっと柔軟にしました。作成者が使用して試してみたいかどうかは、ユーザー次第です。

1
Thielicious

このコードスニペットは役に立ちますか?

if (!count($_SESSION)>0) {
    session_start();
}
1
Niroshan

PHP 5.3ではこれは私のために働きます:

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

それであなたは持っています。もしあなたがnot at if文を始めないのであれば、セッション開始はどうしても始められないでしょう。

1

レスポンスは@ Meliza Ramosレスポンス(最初のレスポンスを参照)および http://php.net/manual/en/function.phpversion.phpに基づいています

行動:

  • pHP_VERSION_IDが存在しない場合は定義します
  • pHP_VERSION_IDに基づいてバージョンをチェックする関数を定義します
  • openSession()に安全な関数を定義する

openSession() のみを使用してください。

    // PHP_VERSION_ID is available as of PHP 5.2.7, if our
    // version is lower than that, then emulate it
    if (!defined('PHP_VERSION_ID')) {
        $version = explode('.', PHP_VERSION);

        define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));


        // PHP_VERSION_ID is defined as a number, where the higher the number
        // is, the newer a PHP version is used. It's defined as used in the above
        // expression:
        //
        // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
        //
        // Now with PHP_VERSION_ID we can check for features this PHP version
        // may have, this doesn't require to use version_compare() everytime
        // you check if the current PHP version may not support a feature.
        //
        // For example, we may here define the PHP_VERSION_* constants thats
        // not available in versions prior to 5.2.7

        if (PHP_VERSION_ID < 50207) {
            define('PHP_MAJOR_VERSION',   $version[0]);
            define('PHP_MINOR_VERSION',   $version[1]);
            define('PHP_RELEASE_VERSION', $version[2]);

            // and so on, ...
        }
    }

    function phpVersionAtLeast($strVersion = '0.0.0')
    {
        $version = explode('.', $strVersion);

        $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];

        if(PHP_VERSION_ID >= $questionVer)
            return true;
        else
            return false;

    }

    function openSession()
    {
        if(phpVersionAtLeast('5.4.0'))
        {
            if(session_status()==PHP_SESSION_NONE)
                session_start();
        }
        else // under 5.4.0
        {
            if(session_id() == '')
                session_start();
        }
    }
1
user1817927

次の解決策を使用して、PHPセッションがすでに開始されているかどうかを確認できます。

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}
0
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}
0
Sukanya Suku

これは私がセッションが開始したかどうかを判断するために使用するものです。次のようにemptyとissetを使用します。

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}
0

私はステータスの二重チェックで終わった。 PHP 5.4以降

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
0
Leo Tahk

私の習慣によれば、$_SESSION[]にアクセスする前に、毎回session_startを呼び出してスクリプトを使用する必要があります。マニュアルについては、下記のリンクを参照してください。

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

私にとって少なくともsession_startは名前として混乱します。 session_loadはより明確になります。

0
Eduard Hasanaj

PHP_VERSION_ID はPHP 5.2.7以降で利用可能ですので、まずこれをチェックし、必要ならば作成してください。 session_statusはPHP 5.4以降で利用可能ですので、これもチェックする必要があります。

if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);
    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
    $version = PHP_VERSION_ID;
}
if($version < 50400){
    if(session_id() == '') {
        session_start();
    }
}else{
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
}
0
Christian Kruse