У меня есть файл PHP, который иногда вызывается со страницы, с которой начался сеанс, а иногда со страницы, с которой не начался сеанс. Поэтому, когда у меня есть session_start()
этот скрипт, я иногда получаю сообщение об ошибке «сессия уже началась». Для этого я поставил эти строки:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
но на этот раз я получил это предупреждение:
Примечание: неопределенная переменная: _SESSION
Есть ли лучший способ проверить, началась ли сессия уже?
Если я использую @session_start
, это заставит вещи работать должным образом и просто закроет предупреждения?
php
session
session-variables
логан
источник
источник
Ответы:
Рекомендуемый способ для версий PHP> = 5.4.0, PHP 7
Ссылка: http://www.php.net/manual/en/function.session-status.php
Для версий PHP <5.4.0
источник
session_start();session_write_close();
: тогда условие if не выполняется, но у нас нет открытого сеанса ...session_start()
в верхней части скрипта, ЗАКРЫВАЕТСЯ при выходе из скрипта, ИЛИ когдаsession_write_closed()
вызывается до его завершения. Т.е. сеанс ЗАКРЫВАЕТСЯ, когда его данные записываются в файл cookie сеанса, и сеанс разблокируется для доступа другим скриптом, который также вызывает 'session_start'. ЗАКРЫТИЕ НЕ означает, что сеанс УНИЧТОЖЕН, поэтому. Вы можете закрыть сеанс, выйдя из текущего скрипта или вызоваsession_write_close()
, и вы можете открыть его снова, вызвавsession_start()
. Мое понимание, по крайней мере.Для версий PHP до PHP 5.4.0:
Хотя, IMHO, вам стоит подумать о рефакторинге кода управления сеансом, если вы не знаете, запущен сеанс или нет ...
Тем не менее, мое мнение субъективно, и есть ситуации (примеры которых описаны в комментариях ниже), где может быть невозможно узнать, начался ли сеанс.
источник
В PHP 5.4 введен метод session_status () , который более надежен, чем полагается
session_id()
.Рассмотрим следующий фрагмент:
Итак, чтобы проверить, запущен ли сеанс, рекомендуемый путь в PHP 5.4:
источник
Вы можете сделать это, и это действительно легко.
Надеюсь, поможет :)
источник
$_SESSION=array();
, поэтому этот ответ кажется нормальным.session_destroy()
был вызван, то$_SESSION
все еще может быть установлен. Кроме того, в модульных тестах вы можете установить$_SESSION
напрямую. Но я высказался против этого, так как для большинства практических ситуаций этот ответ должен быть достаточно хорошим (до тех пор, пока PHP 5.3 больше никогда не увидится ...)источник
До PHP 5.4 не было надежного способа узнать, кроме установки глобального флага.
Рассматривать:
Или:
Итак, до PHP 5.4 вы должны установить глобальное логическое значение.
источник
Для всех версий PHP
источник
if ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Проверь это :
Источник http://php.net
источник
Используйте session_id () , она возвращает пустую строку, если не установлена. Это надежнее, чем проверка
$_COOKIE
.источник
Надеюсь, поможет !
источник
Это должно работать для всех версий PHP. Он определяет версию PHP, а затем проверяет, запущен ли сеанс на основе версии PHP. Затем, если сеанс не запущен, он начинает его.
источник
Единственное, что вам нужно сделать, это:
источник
Не уверен в эффективности такого решения, но это из рабочего проекта. Это также используется, если вам нужно определить язык по умолчанию
источник
@
перед вызовом функции подавляет любые ошибки, о которых можно сообщить во время вызова функции.Добавление
@
beforesession_start
заставляет PHP избегать вывода сообщений об ошибках.Например:
Использование
session_start()
после того, как вы уже что-то напечатали в браузере, приводит к ошибке, поэтому PHP отобразит что-то вроде «заголовки не могут быть отправлены: началось с (строка 12)»,@session_start()
в этом случае все равно не будет работать, но сообщение об ошибке не будет напечатано экран.Перед включением файлов или перенаправлением на новую страницу используйте
exit()
функцию, иначе она выдаст ошибку.Этот код можно использовать во всех случаях:
источник
На PHP 5.3 это работает для меня:
тогда у вас есть. Если вы не поместите оператор not at if в начало, сеанс начнется любым способом, я не знаю почему.
источник
Ответ на основе @Meliza Ramos Response (см. Первый ответ) и http://php.net/manual/en/function.phpversion.php ,
ДЕЙСТВИЯ:
использовать только openSession ()
источник
На самом деле, сейчас слишком поздно, чтобы объяснить это здесь, так как это было решено. Это был файл .inc одного из моих проектов, где вы настраивали меню для ресторана, выбирая блюдо и удаляя / добавляя или изменяя порядок. Сервер, на котором я работал, не имел реальной версии, поэтому я сделал его более гибким. Это зависит от авторов, которые хотят использовать и попробовать.
источник
Этот фрагмент кода работает для вас?
источник
Вы должны реорганизовать свой код так, чтобы вы вызывали его
session_start()
ровно один раз за исполнение страницы.источник
источник
PHP_VERSION_ID доступен начиная с PHP 5.2.7, поэтому сначала проверьте это и, если необходимо, создайте его.
session_status
доступно с версии PHP 5.4, поэтому мы должны проверить это тоже:источник
Исходя из моей практики, перед обращением к
$_SESSION[]
вам нужноsession_start
каждый раз звонить, чтобы использовать скрипт. Смотрите ссылку ниже для руководства.http://php.net/manual/en/function.session-start.php
Для меня, по крайней мере
session_start
, сбивает с толку, как имя. Аsession_load
может быть более понятным.источник
я закончил с двойной проверкой статуса. PHP 5.4+
источник
Вы можете использовать следующее решение, чтобы проверить, начался ли уже сеанс PHP:
источник
Это то, что я использую, чтобы определить, начался ли сеанс. Используя empty и isset следующим образом:
источник
Заменить
session_start();
на:источник