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";
}
Почему бы не сделать это?