Данные сеанса сохраняются после session_unset и session_destroy

У меня есть контактная форма contact.php, которая обрабатывается в form-processing.php.

Поля формы хранятся в массиве сеанса (включая ошибки проверки муравьев), и form-processing.php перенаправляет обратно на contact.php в случае ошибки или успеха.

В случае успеха на contact.php отображается сообщение с благодарностью (вместо формы), и сеанс удаляется с помощью session_unset(), за которым следует session_destroy(). Пустая форма должна снова отображаться при обновлении страницы (поскольку массив сеанса будет пустым).

Однако данные в сеансе сохраняются даже после того, как они были unset и destroyed. Как это может быть? Я подтвердил, что сеанс удален, выполнив var_dump до и после session_unset(); session_destroy(); на странице contact.php. Итак, после первого заполнения формы всегда отображается сообщение с благодарностью.

contact.php:

session_start();

if ( $_SESSION['success'] ) {
    // display thank you message
    session_unset();
    session_destroy();
} else {
    //display form
}

form-processing.php:

session_start();

//get $_POST array, validate, sanitize and save to $_SESSION

//send form contents by email

if ($email_sent) {
     $_SESSION['success'] = true;
}

// redirect to contact.php

Отредактировано для обновления

Это установка Wordpress, и возникла проблема с тем, где запускался сеанс. Я переместил session_start() из файла шаблона в условную функцию в functions.php, и теперь форма работает.

Что такое $ email_sent?

Sider Topalov 26.04.2018 18:12
Стоит ли изучать 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
1
61
1

Ответы 1

Это должно полностью уничтожить сеанс:

session_unset();
session_destroy();
session_write_close();
session_regenerate_id(true);
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}

Вы также можете:

$_SESSION = [];

Спасибо, но это просто не работает (в данном случае) - я могу выполнить var_dump после использования приведенного выше кода, чтобы подтвердить, что сеанс «пуст», только для его «регенерации» с исходными данными при обновлении страницы.

James 27.04.2018 10:04

Также очистите cookie перед запуском session_destroy (): if (isset ($ _ COOKIE [session_name ()])) {setcookie (session_name (), '', time () - 42000, '/'); }

Zach Abrams 27.04.2018 22:15

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