Проверьте, что сеанс PHP уже запущен

У меня есть файл PHP, который иногда вызывается со страницы, которая запустила сеанс, а иногда и со страницы, на которой нет сеанса. Поэтому, когда у меня есть session_start() на этом script, я иногда получаю сообщение об ошибке для "session is started". Для этого я поставил эти строки:

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

но на этот раз я получил это предупреждение:

Примечание: переменная Undefined: _SESSION

Есть ли лучший способ проверить, запущен ли сеанс?

Если я использую @session_start, он заставит все работать правильно и просто закроет предупреждения?

+415
источник поделиться
26 ответов

Рекомендуемый способ для версий 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();
}
+662
источник

Для версий PHP до PHP 5.4.0:

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

Хотя, IMHO, вам действительно нужно подумать о реорганизации кода управления сеансом, если вы не знаете, запущен ли сеанс...

Тем не менее, мое мнение субъективно, и есть ситуации (примеры которых описаны в комментариях ниже), где может быть невозможно узнать, запущен ли сеанс.

+160
источник
другие ответы

Связанные вопросы


Похожие вопросы

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
+69
источник

вы можете сделать это, и это действительно легко.

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

Надеюсь, это поможет:)

+34
источник

До 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
источник
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }
+21
источник

Для всех версий php

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}
+10
источник

Проверьте это:

<?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
источник

Используйте session_id(), он возвращает пустую строку, если она не установлена. Он более надежный, чем проверка $_COOKIE.

if (strlen(session_id()) < 1) {
    session_start();
}
+6
источник
if (session_id() === "") { session_start(); }

надеюсь, что это поможет!

+5
источник

Это должно работать для всех версий 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
источник

Единственное, что вам нужно сделать, это:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>
+4
источник

Не уверен в эффективности такого решения, но это из рабочего проекта Это также используется, если вам нужно определить язык по умолчанию

   /**
    * 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
источник

Вы должны реорганизовать свой код, чтобы вы вызывали session_start() ровно один раз на выполнение страницы.

+1
источник

В PHP 5.3 это работает для меня:

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

то у вас есть. Если вы не поместите инструкцию not at if, сеанс начнется каким-либо образом, я не знаю почему.

+1
источник

Ответ основан на @Meliza Ramos Response (см. первый ответ) и http://php.net/manual/en/function.phpversion.php,

Actions:

  • определить PHP_VERSION_ID, если не существует
  • определить функцию проверки версии на основе PHP_VERSION_ID
  • определить функцию для openSession() secure

используйте 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 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
источник
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 одного из моих проектов, в котором вы настраиваете меню для ресторана, выбирая блюдо, удаляя/добавляя или изменяя заказ. На сервере, на котором я работал, не было реальной версии, поэтому я сделал ее более гибкой. Это авторы хотят использовать и попробовать.

+1
источник

Этот фрагмент кода работает для вас?

if (!count($_SESSION)>0) {
    session_start();
}
+1
источник
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}
0
источник

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
источник

Это то, что я использую, чтобы определить, начался сеанс. Используя пустой и isset следующим образом:

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}
0
источник

Основываясь на моей практике, перед доступом к $_SESSION[] вам нужно каждый раз вызывать session_start для использования скрипта. См. Ссылку ниже для руководства.

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

Для меня, по крайней мере, session_start запутан как имя. session_load может быть более понятным.

0
источник

Я закончил с двойной проверкой статуса. php 5. 4+

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
0
источник

Вы можете использовать следующее решение, чтобы проверить, запущен ли сеанс PHP:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}
0
источник

@ перед вызовом функции подавляет любые ошибки, которые могут появиться во время вызова функции.

Добавление @ before session_start говорит PHP избегать печати сообщений об ошибках.

Например:

Использование session_start() после того, как вы уже что-то напечатали в браузере, приводит к ошибке, поэтому PHP будет отображать что-то вроде "заголовки не могут быть отправлены: началось с (строка 12)", @session_start() все равно не будет работать в этом случае, но сообщение об ошибке не выводится на экран.

Перед включением файлов или перенаправлением на новую страницу используйте функцию exit(), иначе она выдаст ошибку.

Этот код можно использовать во всех случаях:


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

-1
источник

Замените session_start(); на:

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}
-2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос