Как правильно уничтожить сеанс PHP в моем коде

Я создал 3 файла.

Первый - это мой файл index.php, в котором хранится весь мой HTML.

// index.php file
<?php 
session_start();
?>

<?php
if (!isset($_SESSION['u_id'])) {
    header("Location: login.php");
    exit();
}
?>

Второй - мой файл входа в систему (часть этого), где я создаю сеансы.

//login.php
$_SESSION['u_id'] = $row['user_id'];
$_SESSION['u_first'] = $row['user_first'];
$_SESSION['u_last'] = $row['user_last'];
$_SESSION['u_email'] = $row['user_email'];
$_SESSION['u_log'] = $row['user_login'];
header("Location: ../index.php?login=success");
exit();

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

//logout.php
<?php 

if (isset($_POST['submit'])) {
    session_start();
    session_unset();
    session_destroy();
    header("Location: ../login.php?logout");
    exit();
}

Итак, проблема в следующем... как вы можете видеть из кода, я проверяю свой файл index.php, если раздел не установлен, чтобы перенаправить пользователей на login.php. После успешного входа в систему и выхода из системы я пытаюсь посетить домашнюю страницу 'index.php'. Я ожидал, что браузер перенаправит меня на login.php, но этого не произошло, я вижу только белый экран без html-кода, когда я проверяю, есть также никаких ошибок в консоли.

Возможный дубликат stackoverflow.com/questions/1475297/phps-white-screen-of-dea‌​th

04FS 12.02.2019 16:12

Вы, вероятно, просто нарушаете правило «без вывода перед отправкой заголовков» … вводя ненужные лишние пробелы между ?> и <?php.

04FS 12.02.2019 16:14
php.net/manual/en/function.session-destroy.php
RiggsFolly 12.02.2019 16:14

Вы говорите, что у вас вообще нет журналов ошибок? Предполагая, что вы начали сеанс правильно, все, что вам нужно сделать, это просто очистить данные сеанса с помощью $_SESSION = []; и убедитесь, что браузер не кэширует страницу.

Martin 12.02.2019 16:14
"в консоли также нет ошибок" ... ну нет - PHP работает на сервере, ваша консоль JavaScript об этом ничего не знает.
CD001 12.02.2019 16:15

Вы начинаете сеанс на logout.php?

Hackrrr 12.02.2019 16:15

Возможный дубликат Белый экран смерти PHP

billynoah 12.02.2019 16:15

у меня должна быть одна страница, которая включает 3 файла, а затем добавить в нее функцию session_start(). Идентификатор сеанса отличается, потому что logout.php, login.php не имеют session_start()

Pascal Tovohery 12.02.2019 16:15

@MartinM «Это тот, который копируется, совершенно другой, не связанный с установкой или удалением сеанса». Это вполне может быть связано. Вы должны поделиться ошибкой, которую вы получаете.

ceejayoz 12.02.2019 16:15
php.net/manual/en/function.session-unset.php говорит: «Используйте session_unset() только для более старого устаревшего кода, который не использует $_SESSION». Я не думаю, что вам следует использовать эту функцию. Вы можете использовать $_SESSION = array(); для явного сброса массива сеансов. session_destroy() их тоже не удаляет.
ADyson 12.02.2019 16:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

// index.php file
<?php 
session_start();
?>
<!-- there is a space below. -->

<?php
if (!isset($_SESSION['u_id'])) {
    header("Location: login.php");
    exit();
}
?>

Измените свой код на

// index.php file
<?php 
session_start(); // not closing php tag just below

if (!isset($_SESSION['u_id'])) {
    header("Location: login.php");
    exit();
}
?>

Когда вы визуализируете страницу, сервер отправляет в браузер HTTP-сообщение.

(из Википедия)

The request/response message consists of the following:

  • Request line, such as GET /logo.gif HTTP/1.1 or Status line, such as HTTP/1.1 200 OK,
  • Headers
  • An empty line
  • Optional HTTP message body data

Если вы отправляете некоторые данные тела сообщения (даже пробел) перед использованием header();, заголовок уже будет отправлен. Выполнение header() после этого не будет иметь никакого эффекта, так как HTTP-сообщение уже определено.

Большое спасибо! Вот и все, это работает правильно, я ожидаю прямо сейчас!

Martin M 12.02.2019 16:18

Вы понимаете, почему?

Cid 12.02.2019 16:20

Я пытаюсь что-то найти и углубиться в это решение, но ничего не могу найти... новичок в php...

Martin M 12.02.2019 16:24

Другие вопросы по теме