Предупреждение: session_destroy()?

#php #session

#php #сессия

Вопрос:

Я пытаюсь исправить свой скрипт входа в систему, на моем локальном хостинге он работает, но загружен на мой онлайн-тестовый сервер, выход из системы нарушен, я получаю эту ошибку:

 Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in htdocs/logout.php on line 17

Warning: Cannot modify header information - headers already sent by (output started at htdocs/logout.php:17) in htdocs/logout.php on line 18

Warning: Cannot modify header information - headers already sent by (output started at htdocs/logout.php:17) in www/htdocs/logout.php on line 34
  

Не совсем уверен, что могло быть причиной этого, поскольку он работал на моем локальном хостинге, есть идеи?

Комментарии:

1. Не могли бы вы показать код logout.php ?

2. Есть ли какой-либо вывод перед session_destroy? Кроме того, каков уровень отчетности PHP в localhost. Если он настроен на игнорирование предупреждений, то он просто не показывает эти сообщения.

3. Привет, проверьте, отображается ли какой-либо вывод в виде заголовка, и перед выполнением session_destroy вы должны запустить сеанс на php, удачи

Ответ №1:

 session_start();
session_destroy(); /*or sesion_unset();*/
  

Комментарии:

1. Это сработало 🙂 спасибо, есть какая-нибудь причина, по которой это работало бы на моем локальном хостинге даже без session_start() ?

2. возможно, вы использовали error_reporting(0), который заставляет скрыть ошибку или имеет настройку в PHP. INI для автоматического запуска сеанса на всей странице! или включили страницу, с которой вы начали сеанс!

3. Понял, спасибо :), кстати, я видел вашу ссылку на ultra light forums, у вас там опечатка, там написано «можете ответить на тему утера». ** Автор

Ответ №2:

Для работы session_destroy сеанс должен быть запущен с помощью session_start .

Комментарии:

1. Это сработало 🙂 спасибо, есть какая-нибудь причина, по которой это работало бы на моем локальном хостинге даже без session_start() ???

2. Вы также можете использовать конфигурационную директиву session.auto_start

Ответ №3:

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

Начиная с PHP 5.4.0, вы можете проверить это следующим образом:

 if(session_status() == PHP_SESSION_ACTIVE)
{
    session_destroy();
}
  

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

Согласно руководству по PHP, session_status вернет целое число, которое можно сравнить со следующими константами:

 Return Values 

• PHP_SESSION_DISABLED - Returned if sessions are disabled. 
• PHP_SESSION_NONE - Returned if sessions are enabled, but none exists. 
• PHP_SESSION_ACTIVE - Returned if sessions are enabled, and one exists. 
  

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