неожиданное взаимодействие с $ _SESSION и буферизацией объекта

Изменить: я просто не выходил после отправки перенаправления заголовка.

При отображении значения сеанса внутри выходного буфера включаемого файла, если значение изменяется позднее в сценарии, более поздним значением является то, которое отображается.

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

Проблема в том, что $_SESSION ведет себя неожиданным образом, следуя шаблону POST to GET:

Публикуйте в форму, она устанавливает что-то в сеансе, а затем выполняет перенаправление get на другую страницу. На перенаправленной странице, если вы выводите что-то из сеанса, а затем манипулируете этим ПОСЛЕ оператора echo, конечный результат состоит в том, что то, что есть echo, отражает последующее изменение. То же самое касается unset; эхо что-то из сессии, то unset это, и результат, что это эхо и пустая строка.

Вот основной пример:

form.php

if (!empty($_POST['string'])) {
$_SESSION['message'] = $_POST['string'];
header("Location: ./index.php?page=formHandler");
//EDIT - This was not in the original code
//exit;
} else {
?>
<form action="index.php?page=form" method="post">
<input type="text" name="string"><input type="submit" />
</form>
<?php
}

formHandler.php

if (isset($_SESSION['message'])) {
echo $_SESSION['message'];
$_SESSION['message'] = "changed";
}

index.php

session_start();

ob_start();
include $_GET['page'] . ".php";
$page = ob_get_clean();
echo $page;

Итак, что происходит:

Начиная с form.php (который включен в индекс)

Введите значение, опубликуйте его.

Текст "changed" всегда отображается, даже если он установлен после echo заявление.

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

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

Использование PHP 5.4

0

Решение

ОБНОВИТЬ: Я собираюсь пойти дальше и предположить, что в коде есть двойное перенаправление, которым вы не поделились. Это приведет к тому, что браузер будет отображать «изменено» вместо введенной строки, так как при второй загрузке страницы $ _SESSION [‘message’] уже будет установлено на ‘изменено’

оригинальный ответ:

Ваш код, как это было, давал мне неопределенную ошибку $ _POST [‘string’], поэтому я изменил

if ($_POST['string']) {

в form.php для

if (isset($_POST['string']) {

и он функционирует правильно, повторяя строку, которую я ввожу в форму.

Изменить: я проверил без isset, как описано выше, и, хотя я все еще получаю ошибку «Неопределенный индекс: строка» в форме index.php? Page =, страница index.php? Page = formHandler выводит текст, введенный в форма, а не «изменилась»

Есть ли что-то еще в коде, которым вы не поделились, что вызывает проблему?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]