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

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

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

Когда страница обновляется, я хочу отобразить сообщение «Данные обновлены». Было что-то вроде этого с Referer Я верю, но не могу вспомнить.

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

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

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

Ответы [ 4 ]

3 голосов
/ 20 мая 2010

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

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'] для определения, с какой страницы пришел посетитель.

2 голосов
/ 20 мая 2010

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

а. перенаправить на себя, но с дополнительной информацией - «? 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";
}

... и да, ваше перенаправление является правильным способом предотвращения повторного принятия решения

1 голос
/ 20 мая 2010

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

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

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

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

0 голосов
/ 20 мая 2010

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

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

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

...