У меня есть 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 ,
ДЕЙСТВИЯ:
используйте только 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; } }