Проверьте, началась ли сессия PHP - PullRequest
426 голосов
/ 06 июня 2011

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

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

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

Примечание: неопределенная переменная: _SESSION

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

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

Ответы [ 26 ]

5 голосов
/ 02 января 2015
if (session_id() === "") { session_start(); }

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

4 голосов
/ 28 декабря 2013

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

<?php
if(!isset($_SESSION))
{
session_start();
}
?>
2 голосов
/ 27 марта 2013

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

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }
1 голос
/ 06 июня 2011

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

1 голос
/ 15 апреля 2016

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

ДЕЙСТВИЯ:

  • определить 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'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 голос
/ 28 сентября 2013

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

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

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

1 голос
/ 28 июня 2017

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

if (!count($_SESSION)>0) {
    session_start();
}
1 голос
/ 27 апреля 2016
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 одного из моих проектов, в котором вы настраивали меню для ресторана, выбирая блюдо и удаляя / добавляя или изменяя порядок. Сервер, на котором я работал, не имел реальной версии, поэтому я сделал его более гибким. Авторы желают использовать и попробовать.

0 голосов
/ 30 января 2019

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

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

Например:

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

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

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


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

0 голосов
/ 09 сентября 2018

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

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}
...