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

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

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

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

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

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

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

Рекомендуемый способ для версий PHP> = 5.4.0

 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(); } 

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

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

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

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

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 

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

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

Надеюсь, поможет 🙂

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

До 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 вы должны установить глобальное логическое значение.

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

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

Проверь это :

 <?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

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

 if (strlen(session_id()) < 1) { session_start(); } 
 if (session_id() === "") { session_start(); } 

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

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

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

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

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

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

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

Ответ ОСНОВАН на @Meliza Ramos Response (см. Первый ответ) и 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(); } } 
 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 одного из моих проектов, в котором вы настраиваете меню для ресторана, выбирая блюдо, удаляя / добавляя или изменяя заказ. На сервере, на котором я работал, не было реальной версии, поэтому я сделал ее более гибкой. Авторы хотят использовать и попробовать.

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

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

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

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

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

 session_start(); if(!empty($_SESSION['user'])) { //code; } else { header("location:index.php"); } 

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(); } } 

То, что я использую, чтобы определить, начался ли сеанс, является использование empty и isset следующим образом:

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

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

 if (!isset($a)) { a = False; if ($a == TRUE) { session_start(); $a = TRUE; } }