2012-01-09 7 views
2

У меня есть форма (для A), которая перенаправляется в другую форму (форма B).

Когда пользователь перенаправляется в форму B, устанавливается значение $ _POST, запускается функция электронной почты. Это проблема b/c, если пользователь перезагружает страницу, это письмо снова отправляется.

Я хотел был бы прекратить посылать электронную почту если страница загружена.

Следовательно, я включил поле в форме A, type = hidden со значением = отправить, и когда отправлено электронное письмо (форма B), я отключу это поле, но если я загружу страницу, письмо отправляется в любом случае.

if(isset($_POST['emailtrigger'])){ 

      emailfunction();   
    unset($_POST['emailtrigger']); 


    } 

Как я мог перемотать на страницу, после того, как сообщение было отправлено, если страница (форма B) перезагружается, чтобы пропустить функцию электронной почты?

Спасибо

+2

Это то, что [303 перенаправления] (http://en.wikipedia.org/wiki/HTTP_303) предназначены для ... – DaveRandom

+0

Вы не можете их отменить, потому что они отправляются с клиента. PHP - это серверный язык. Вы можете использовать сеанс PHP, чтобы определить, была ли эта страница возмущена. – craig1231

+0

@DaveRandom: вы видите много ответов, которые должны были быть комментариями, но это комментарий, который должен был быть ответом. :) – netcoder

ответ

3

Если вы хотите избежать перенаправления или хотите защитить себя от пользователей, которые нажимают «Назад» и повторно представляют форму после перенаправления, простым решением было бы добавить скрытое поле со случайным значением, сгенерированным при загрузке формы. После отправки формы просто напишите это значение поля в данные сеанса. Затем, если пользователь отправляет те же данные формы, вы сравниваете случайное поле и то, что написано в данных сеанса. Если это значение - вы не обрабатываете данные формы.

+1

Я реализовал создание сеанса, установив переменную сеанса внутри if ($ _POST && session ['thevariable']! = '1') {email ... $ _session ['thevariable'] = 1; } Когда страница перезагружается, $ _session ['thevariable'] == 1, и поэтому письмо не запускается. THANK YOU – IberoMedia

+0

Добро пожаловать! – Ranty

1

Это, очевидно, выполняется перенаправление на ту же страницу, после обработки формы. Так что, если ваша форма обрабатывается скриптом form.php, то после отправки электронной почты, вы должны сделать редирект:

header('location: form.php'); 

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

+0

Мне нужна $ _POST через форму B, поэтому мне нужно поддерживать $ _POST вживую. Я предполагаю, что ваш ответ предполагает, что я избавлюсь от $ _POST в form.php и перенаправляется на форму B? – IberoMedia

+0

+1 для использования слова «очевидно» - на самом деле смеялся, когда я читал это. –

+0

@ibero - существует множество способов применения базового принципа, но идея перенаправления состоит в том, чтобы избежать запуска постсоветского вызова isset - в зависимости от того, как вы это настроили. Вы можете использовать сеансы, чтобы содержать данные формы 1, скрытые поля и т. Д. Варианты многочисленны.Вы даже можете установить сеанс var для количества раз, когда сообщение было отправлено, и предотвратить его, если оно превысило 1. Ваш выбор. –

1

Как только A выполнит свою работу, продолжите форму B, $_POST будет доступна.

После того, как B делается, выполнить

header('location: formConfirm.php'); 
exit; 

Сценарий formConfirm.php бы напечатать сообщение, подтверждающее, ничего другого. В частности, он не должен обновлять БД или отправлять электронную почту.

В общем случае вы можете реализовать общий formConfirm.php, который вы всегда используете для подтверждения. как-то передавая фактическое подтверждающее сообщение.

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