Нет пути назад, остановить PHP, переделывающий все, если пользователь нажимает обновить? - PullRequest
0 голосов
/ 13 декабря 2011

Я младший разработчик PHP, и в настоящее время я работаю над созданием формы цитаты, которая будет содержать данные о клиенте и все, что сотрудник вводит в форму цитаты и будет:

  • Сохранение информации о клиентах и ​​ценах в БД.
  • Создание PDF (с использованием библиотеки mpdf)
  • Отправить PDF клиенту по электронной почте

В настоящее время это всего два файла index.php и quote.php

Вот схема

http://i.imgur.com/UDnLq.png

Как видите, это монолитная архитектура (у меня все операции в одном PHP-файле).

Это вызывает проблемы, так как когда пользователь нажимает «SUBMIT» и quote.php выполняет все свои функции, пользователь застревает на этой странице. Затем, если они нажмут Refresh , quote.php будет перезапущен снова, и это приведет к спаму в моих таблицах базы данных и почтовом ящике.

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

У меня была пара идей, и я надеялся, что вы могли бы предложить мне свою?

  • Идея 1: переменная сеанса, которая предотвращает повторное выполнение того же кода.

  • Идея 2: Разбейте файл quote.php на отдельные файлы и прыгайте с каждого из них. (это возможно)?

Я хочу сделать это как можно лучше, и я открыт для любых предложений!

Спасибо за ваше время!

:)

Ответы [ 6 ]

1 голос
/ 13 декабря 2011

Если обработка формы занимает некоторое время (генерация PDF может занять некоторое время), то хорошим первым шагом будет предотвращение повторной отправки формы пользователем. Используйте JavaScript, чтобы отключить кнопку отправки и, возможно, показать значок загрузки, чтобы они знали, что что-то происходит.

По завершении выполнения кода вы захотите перенаправить их на другую страницу, чтобы у вас не возникало проблем с обновлением страницы.

Это довольно просто, просто отправьте заголовок ...

// do PDF and email code
// now redirect user to thank you page
header("Location: thank_you.php");
exit();
1 голос
/ 13 декабря 2011

После того, как вы сохранили информацию о клиенте, перенаправьте на другую страницу, например, страницу с благодарностью. Кроме того, вы можете сохранить флаг в сеансе, как quote_submitted = 1 после успешной операции. Затем, когда нажата кнопка «Обновить» или «Отправить», отметьте ее, чтобы избежать циклических операций.

Иначе, есть ли способ сохранить какой-нибудь идентификатор клиента? Затем вы можете проверить, сохранил ли клиент свою запись или нет, поэтому повторных представлений не будет.

1 голос
/ 13 декабря 2011

То, что вы хотите сделать, называется PRG или Post / Redirect / Get .После успешного POST-запроса вы перенаправляете на другую страницу через Location заголовок.Эта страница будет только отображать что-то (например, сообщение о состоянии), но не будет выполнять никаких действий.Нажатие на F5 будет просто перезагружать эту страницу вместо того, чтобы снова выполнить запрос POST.

Очевидно, что это также работает без POST, но использование GET для действия, которое изменяет вещи, на самом деле не очень хорошая идея.

0 голосов
/ 13 декабря 2011

Одной из возможностей является реализация подхода post-redirect-get.

Проще говоря, запрос POST никогда не будет доставлен в браузер.Вместо этого вы выполняете все необходимые действия и сохраняете необходимую информацию в сеансе, а затем выполняете перенаправление с кодом 303.

$page = 'quote_done.php';
header('Location: '.$page, true, 303);
exit;

При этом браузере будет отображаться «quote_done.php».page (запрос GET) вместо страницы, запрашиваемой с помощью POST.Это также страница, которая добавляется в историю, поэтому при обновлении и использовании кнопки «назад» никогда не будет выполнен другой запрос POST.В качестве приятного побочного эффекта вы избавляетесь от предупреждений браузера о повторной отправке данных, обычно пользователь в любом случае не может решить, что делать дальше.

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

0 голосов
/ 13 декабря 2011

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

0 голосов
/ 13 декабря 2011

Если все правильно, вы можете отправить заголовок:

header('Location: http://www.yourdomain.com/another_page.php');

и перейти на другую страницу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...