Обработка информации, полученной из формы

Задача
Необходимо использовать одну и ту же страницу HTML для вывода формы и обработки введенных в ней данных. Другими словами, требуется избежать размножения страниц, которые работают на отдельных этапах транзакции.

Решение
Используйте скрытое поле в форме, чтобы указать программе, что предполагается его обработка в форме. В данном случае скрытое поле называется stage и имеет значение process:

if (isset($_POST['stage']) && ('process' == $_POST['stage'])) {
process_form();
} else {
print_form();
}

Обсуждение
Когда люди создавали формы на заре развития Всемирной паутины, они делали две страницы: статическую HTML-страницу с формой исценарий, который обрабатывал форму и возвращал динамически сгенерированный ответ пользователю. Это было немного громоздко, поскольку form.html была источником для form.cgi, и если одна страница изменялась, то нужно было не забыть также отредактировать и другую, иначе сценарий мог работать неправильно.

Формы легче поддерживать, когда все части находятся в том же самом файле, а контекст определяет, какие разделы отображать. Используйте скрытое поле формы с именем stage, чтобы отслеживать позицию в процессе обработки формы; оно действует как диспетчер этапов, возвращающих пользователю соответствующий HTML-документ.


Однако
иногда такой подход невозможен; например, когда ваша форма обрабатывается сценарием на каком-нибудь другом сервере.

Однако, создавая HTML-документ для формы, не прописывайте жестко путь к странице в атрибуте action. Это делает невозможным переименование и изменение местоположения страницы без одновременного ее редактирования. Вместо этого PHP предоставляет полезную переменную: $_SERVER['PHP_SELF']

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

Поэтому пример во введении этой главы теперь выглядит следующим образом:

if (isset($_POST['stage']) && ('process' == $_POST['stage'])) {
process_form();
} else {
print_form();
}
function print_form() {
echo <<
What is your first name?

END;
}
function process_form() {
echo 'Hello ' . $_POST['first_name'] . '!';
}

Если форма имеет более одного этапа, то просто устанавливайте атрибут stage в новое значение для каждого этапа.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Защита от многократной отправки одной и той же формы
Использование элементов формы с несколькими вариантами значений
Кэширование запросов и результатов
Обработка внешних переменных с точками в именах
Обработка загруженных файлов

Вернуться в раздел: PHP / 9. Формы