2010-05-19 2 views
0

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

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

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

кстати Я также использую:

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

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

+1

Вам не нужно, чтобы установить атрибут действия на вашей форме. Форма представляется сама по себе. – mercator

+0

Таким образом

будет делать ?? Милая! – FFish

+2

Да. Но если вы используете HTML-код или документ XHTML, и вы хотите, чтобы ваш HTML-код проверялся, вам нужно сохранить атрибут в. 'Action =" "'. С помощью документа HTML5 вы можете оставить его. – mercator

ответ

3

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

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'], чтобы обнаружить, что страница пришел посетитель из.

+0

Я бы сказал, что проверка реферера достаточно хороша, если это просто для того, чтобы показать информационное сообщение. – mercator

+0

Спасибо, Jeroen.Что-то вроде: if (basename ($ _ SERVER ['HTTP_REFERER']) == basename ($ _ SERVER ['PHP_SELF'])) echo «данные обновлены»; Будет ли сейчас трюк? Я не очень беспокоюсь о безопасности, поскольку эта страница находится за системой входа в систему. – FFish

+0

@FFish: Что-то вроде этого должно это сделать. Обратите внимание, что если люди могут нажать на ссылку на одну и ту же страницу, они также получат это сообщение (например, щелчок по контакту на странице контактов). – jeroen

0

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

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

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

+1

Потому что он делает перенаправление там и должен показать «Данные обновлены» после этого перенаправления. – mercator

+0

О, неправильно понял. Спасибо mercator, приятно, когда люди помогают больше, чем просто люди, задающие вопрос, SO - отличное сообщество. – dscher

1

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

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

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

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

2

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

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

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

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

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

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

+0

спасибо, но у меня уже есть var там вроде: admin/photos-edit.php? Ref = 002140 и хотел бы сохранить его таким образом. – FFish

+0

ok, поэтому вы можете добавить '& updated = true' вместо (амперсанд вместо вопросительного знака). Вы в конечном итоге получите admin/photos-edit.php? Ref = 002140 & updated = true – laher

+0

Да, я знаю, это хорошее решение, но я хочу, чтобы URL-адрес был чистым. thnx в любом случае – FFish

Смежные вопросы