Изменить: я просто не выходил после отправки перенаправления заголовка.
При отображении значения сеанса внутри выходного буфера включаемого файла, если значение изменяется позднее в сценарии, более поздним значением является то, которое отображается.
Наш веб-сайт использует внутреннюю структуру, где каждая страница находится в своем собственном файле, который включается 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
ОБНОВИТЬ: Я собираюсь пойти дальше и предположить, что в коде есть двойное перенаправление, которым вы не поделились. Это приведет к тому, что браузер будет отображать «изменено» вместо введенной строки, так как при второй загрузке страницы $ _SESSION [‘message’] уже будет установлено на ‘изменено’
оригинальный ответ:
Ваш код, как это было, давал мне неопределенную ошибку $ _POST [‘string’], поэтому я изменил
if ($_POST['string']) {
в form.php для
if (isset($_POST['string']) {
и он функционирует правильно, повторяя строку, которую я ввожу в форму.
Изменить: я проверил без isset, как описано выше, и, хотя я все еще получаю ошибку «Неопределенный индекс: строка» в форме index.php? Page =, страница index.php? Page = formHandler выводит текст, введенный в форма, а не «изменилась»
Есть ли что-то еще в коде, которым вы не поделились, что вызывает проблему?
Других решений пока нет …