Проверьте, что сеанс PHP уже запущен
У меня есть файл PHP, который иногда вызывается со страницы, которая запустила сеанс, а иногда и со страницы, на которой нет сеанса. Поэтому, когда у меня есть session_start()
на этом script, я иногда получаю сообщение об ошибке для "session is started". Для этого я поставил эти строки:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
но на этот раз я получил это предупреждение:
Примечание: переменная Undefined: _SESSION
Есть ли лучший способ проверить, запущен ли сеанс?
Если я использую @session_start
, он заставит все работать правильно и просто закроет предупреждения?
Ответы
Ответ 1
Рекомендуемый способ для версий 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();
}
Ответ 2
Для версий PHP до PHP 5.4.0:
if(session_id() == '') {
// session isn't started
}
Хотя, IMHO, вам действительно нужно подумать о реорганизации кода управления сеансом, если вы не знаете, запущен ли сеанс...
Тем не менее, мое мнение субъективно, и есть ситуации (примеры которых описаны в комментариях ниже), где может быть невозможно узнать, запущен ли сеанс.
Ответ 3
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
Ответ 4
вы можете сделать это, и это действительно легко.
if (!isset($_SESSION)) session_start();
Надеюсь, это поможет:)
Ответ 5
До 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 вы должны установить глобальное логическое значение.
Ответ 6
if (version_compare(phpversion(), '5.4.0', '<')) {
if(session_id() == '') {
session_start();
}
}
else
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
Ответ 7
Для всех версий php
if ((function_exists('session_status')
&& session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
session_start();
}
Ответ 8
Проверьте это:
<?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();
}
Ответ 10
if (session_id() === "") { session_start(); }
надеюсь, что это поможет!
Ответ 11
Это должно работать для всех версий 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();
}
}
}
Ответ 12
Единственное, что вам нужно сделать, это:
<?php
if(!isset($_SESSION))
{
session_start();
}
?>
Ответ 13
Не уверен в эффективности такого решения, но это из рабочего проекта
Это также используется, если вам нужно определить язык по умолчанию
/**
* Start session
* Fall back to ukrainian language
*/
function valid_session() {
if(session_id()=='') {
session_start();
$_SESSION['lang']='uk';
$_SESSION['lang_id']=3;
}
return true;
}
Ответ 14
Вы должны реорганизовать свой код, чтобы вы вызывали session_start()
ровно один раз на выполнение страницы.
Ответ 15
В PHP 5.3 это работает для меня:
if(!strlen(session_id())){
session_name('someSpecialName');
session_start();
}
то у вас есть. Если вы не поместите инструкцию not at if, сеанс начнется каким-либо образом, я не знаю почему.
Ответ 16
Ответ основан на @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();
}
}
Ответ 17
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 одного из моих проектов, в котором вы настраиваете меню для ресторана, выбирая блюдо, удаляя/добавляя или изменяя заказ.
На сервере, на котором я работал, не было реальной версии, поэтому я сделал ее более гибкой. Это авторы хотят использовать и попробовать.
Ответ 18
Этот фрагмент кода работает для вас?
if (!count($_SESSION)>0) {
session_start();
}
Ответ 19
session_start();
if(!empty($_SESSION['user']))
{
//code;
}
else
{
header("location:index.php");
}
Ответ 20
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();
}
}
Ответ 21
Это то, что я использую, чтобы определить, начался сеанс. Используя пустой и isset следующим образом:
if (empty($_SESSION) && !isset($_SESSION)) {
session_start();
}
Ответ 22
Основываясь на моей практике, перед доступом к $_SESSION[]
вам нужно каждый раз вызывать session_start
для использования скрипта. См. Ссылку ниже для руководства.
http://php.net/manual/en/function.session-start.php
Для меня, по крайней мере, session_start
запутан как имя. session_load
может быть более понятным.
Ответ 23
Я закончил с двойной проверкой статуса. php 5. 4+
if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
Ответ 24
Вы можете использовать следующее решение, чтобы проверить, запущен ли сеанс PHP:
if(session_id()== '')
{
echo"Session isn't Start";
}
else
{
echo"Session Started";
}
Ответ 25
@
перед вызовом функции подавляет любые ошибки, которые могут появиться во время вызова функции.
Добавление @
before session_start
говорит PHP избегать печати сообщений об ошибках.
Например:
Использование session_start()
после того, как вы уже что-то напечатали в браузере, приводит к ошибке, поэтому PHP будет отображать что-то вроде "заголовки не могут быть отправлены: началось с (строка 12)", @session_start()
все равно не будет работать в этом случае, но сообщение об ошибке не выводится на экран.
Перед включением файлов или перенаправлением на новую страницу используйте функцию exit()
, иначе она выдаст ошибку.
Этот код можно использовать во всех случаях:
<?php
if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
session_start();
}
?>
Ответ 26
Замените session_start();
на:
if (!isset($a)) {
a = False;
if ($a == TRUE) {
session_start();
$a = TRUE;
}
}