PHP определяет, была ли страница перезагружена с помощью PHP_SELF

У меня есть форма, которая перезагружает страницу с обновленными данными:

<form name="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    ...
    <input type="submit" name="Submit" value="Update data">
</form>

Когда страница обновляется, я хочу отобразить сообщение "Данные обновлены". Было что-то подобное с Реферером, которого я люблю, но не помню.

Кстати, я также использую:

if (isset($_POST['Submit'])) {
    // prevent resending data
    header("Location: " . $_SERVER['PHP_SELF']);
}

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

4 ответа

Решение

Если вы хотите быть абсолютно уверены, что форма была отправлена, вы можете сохранить переменную в сеансе:

session_start();      // at top of page
...
if (isset($_POST['Submit'])) {
    $_SESSION['form_submitted'] = true;
    ...
    // prevent resending data
    header("Location: " . $_SERVER['PHP_SELF']);
}
elseif ($_SESSION['form_submitted'])
{
    ...
}

Менее надежным, но также возможно использование $_SERVER['HTTP_REFERER'] определить, с какой страницы пришел посетитель.

Вы могли бы сделать что-то вроде этого...

а. перенаправить на себя, но с дополнительной информацией - "?updated=true" (или **&**updated=true, если PHP_SELF уже содержит строку запроса)

if (isset($_POST['Submit'])) {
    // prevent resending data
    header("Location: " . $_SERVER['PHP_SELF'] . '?updated=true');
}

б. Основываясь на этой дополнительной информации, отобразите текст.

if (isset($_GET['updated'])) {
    echo "data updated";
}

... и да, ваш редирект - верный способ предотвратить повторную передачу

Общепринятым способом предотвращения сообщения " Отправить данные" является использование шаблона Post-Redirect-Get.

В идеале не следует использовать одну и ту же страницу для отображения результатов, а также для обработки формы. Я бы предложил переместить "Данные обновлены" на отдельную страницу, на которую вы перенаправляете после проверки формы.

Таким образом, кнопка "Назад" в браузере ведет себя интуитивно для пользователя без этих назойливых сообщений.

Кроме того, технически значение $_SERVER "referer" может быть подделано, поэтому не всегда следует полагаться на него.

Вы можете просто использовать то, что вы используете в значительной степени:

if (isset($_POST['submit'])) {
    echo "data submitted";
}

Почему бы не сделать это?

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