2012-04-10 4 views
14

есть короткий трюк кода, чтобы проверить, начался сеанс, а если нет, то загрузите его? В настоящее время я получаю сообщение об ошибке «session уже начал ...», если я включил сеанс, независимо от проверки.Загрузить session_start() только в том случае, если сеанс не существует?

ответ

35

isset, как правило, правильный способ проверить, если предопределенные переменные в настоящее время определены:

Если вы используете версию PHP до 5,4,

обычно вы можете уйти с и его заманчивым просто выполните код ниже, но имейте в виду, что если по какой-либо причине сеансы отключены, session_start() все равно будет вызван, что может привести к ошибкам и ненужной отладке, поскольку массив $ _SESSION не может быть создан.

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

, если вы хотите, чтобы учесть для проверки, чтобы увидеть, если занятия будут отключены по какой-то причине, вы можете подавить сообщение об ошибке, установите переменный сеанс тест, а затем проверить, она была установлена. Если это не так, вы можете запрограммировать реакцию на сеансы с отключенным доступом. Вы захотите сделать все это в начале сценария или рядом с ним. Так как пример (работает по-разному в зависимости от настроек обработки ошибок):

if(!isset($_SESSION)){session_start();} 
$_SESSION['valid'] = 'valid'; 
if($_SESSION['valid'] != 'valid') 
{ 
    //handle disabled sessions 
} 

Однако, если вы используете PHP версии 5.4 или выше,

Вы можете использовать функцию session_status(), лучший вариант, как он учитывает, что сеансы отключены, и проверяет, существует ли сеанс.

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

ВНИМАНИЕ, что PHP_SESSION_NONE постоянный набор на PHP и поэтому не должны быть обернуты в кавычки. Он оценивает целое число 1, но поскольку его константа, специально предназначенная для устранения потребности в магических числах, лучше всего проверять на константу.

+0

спасибо за упоминание решения для php <5.4 – Houston

+0

@nick хорошо, я бы сказал, что вы либо нашли ошибку в 5.4.16, либо, скорее всего, создали странную конфигурацию php/server. В любом случае это хорошо, чтобы скопировать их, возможно, крайние случаи: D – Rooster

7

Многие люди просто используют @session_start(), чтобы предупредить, что сеанс уже запущен. В качестве альтернативы, как правило:

if (session_status() === PHP_SESSION_NONE) session_start(); 
1
if (session_id() === "") { session_start(); } 
3

попробовать это условие

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

Если вы хотите, чтобы избежать этой ошибки, используйте @ перед функцией Например:

@session_start(); 
+0

Привет, добро пожаловать в SO. Не могли бы вы отредактировать свой пост, чтобы объяснить, что делает ваш код и как он решает проблему OP? Кодовые ответы не поощряются и подлежат удалению. –

0

Checking для существующей сессии до начала нового:

// # if phpversion() is >= 5.4 
    if(phpversion() >= 5.4) { 

    // # check session_status() function for value 'PHP_SESSION_NONE' 
    if(session_status() === PHP_SESSION_NONE) { 
     session_start(); 
    } 

    } else { // # maintain backwards compat. with PHP versions older than 5.4 

     // # if $_SESSION object if NOT set, start a new session! 
     if(!isset($_SESSION)) { 
     session_start(); 
     } 
    } 
Смежные вопросы