MySQL / 18. Обработка ввода через Web с помощью MySQL

Создание форм в сценариях

Задача
Вы хотите написать сценарий, который получает ввод от пользователя.

Решение
Создайте в сценарии форму для заполнения и отправьте ее пользователю. Сценарий может сам вызывать себя повторно для обработки содержимого формы после ее отправки пользователем.

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

Форма начинается тегом <form>, а заканчивается тегом </form>. Между этими двумя тегами можно размещать другие HTML-конструкции, включая специальные элементы, которые превратятся в поля ввода на странице, выводимой броузером. Начинающий форму тег <form> содержит два атрибута: action и method. Атрибут action сообщает броузеру, что следует сделать с формой, когда пользователь отправит ее. Он представляет собой URL сценария, который должен быть вызван для обработки содержимого формы. Атрибут method указывает броузеру, какой вид запроса HTTP необходимо использовать для отправки формы; возможны значения GET или POST, в зависимости от того, какой тип запроса для отправки формы вы предпочитаете. Различие методов запроса обсуждается в рецепте 18.5, а пока мы будем использовать только POST.

Большинство веб-сценариев, приведенных в главе, ведет себя во многом похоже:

• При первом вызове сценарий генерирует форму и отправляет ее пользователю для заполнения.

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

• Сценарий определяет, вызван ли он впервые или же он должен обрабатывать полученную форму, проверяя, с какими параметрами он вызван.

При первом вызове окружение не будет содержать параметров, указанных в форме.

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

Если сценарий создания формы хочет повторно вызывать себя при отправке пользователем формы, он должен определить путь к самому себе в дереве каталогов веб-сервера и использовать это значение для атрибута action открывающего тега <form>. Например, если сценарий установлен как /cgi-bin/myscript, тег можно записать так:

<form action="/cgi-bin/myscript" method="POST">

Каждый API предлагает для сценария способ получения пути к самому себе, поэтому не нужно жестко кодировать имя в сценарии. Тем самым вы обеспечиваете возможность его установки в любом месте.Для сценариев на Perl модуль CGI.pm предлагает три метода создания элементов <form> и формирования атрибута action. Методы start_form() и end_form() создают открывающий и закрывающий теги формы, а url() возвращает путь к сценарию. При помощи этих трех методов сценарий может
сгенерировать форму так:

print start_form (-action => url (), -method => "POST");
# ... генерируем элементы формы ...
print end_form ();

В действительности атрибут method необязателен; если не указать его, start_form() передает значение по умолчанию – POST.

В PHP простой способ получения пути к сценарию – использование глобальной переменной $PHP_SELF:

print ("<form action=\"$PHP_SELF\" method=\"POST\">\n");
# ... генерируем элементы формы...
print ("</form>\n");

Однако в некоторых конфигурациях PHP (когда отключен параметр register_globals) такой способ не работает.1 Можно получить путь к сценарию, обратившись к члену "PHP_SELF" массива $HTTP_SERVER_VARS или, начиная с версии PHP 4.1, массива $_SERVER. Для того чтобы просто получить путь к сценарию способом, подходящим для различных версий языка, приходится терять много времени на проверку разных источников информации, поэтому разумно написать функцию, которая получала бы для нас этот путь. Рассмотрим функцию get_self_path(), которая использует массив $_SERVER, если он доступен, и обращается к $HTTP_SERVER_VARS или $PHP_SELF в противном случае. То есть эта функция предпочитает использовать последние возможности языка, но будет работать и для сценариев старых версий PHP:

function get_self_path ()
{
global $HTTP_SERVER_VARS, $PHP_SELF;
if (isset ($_SERVER["PHP_SELF"]))
$val = $_SERVER["PHP_SELF"];
else if (isset ($HTTP_SERVER_VARS["PHP_SELF"]))
$val = $HTTP_SERVER_VARS["PHP_SELF"];
else
$val = $PHP_SELF;
return ($val);
}

Переменные $HTTP_SERVER_VARS и $PHP_SELF являются глобальными, но должны быть объявлены таковыми явно, при помощи ключевого слова global, если они используются не в глобальном контексте, а, например, внутри функции.

$_SERVER – это «суперглобальный» массив, доступный в любом контексте без объявления его глобальным.Функция get_self_path() входит в состав библиотечного файла Cookbook_Webutils.

php из каталога lib дистрибутива recipes. Если вы устанавливаете этот файл в каталог, который PHP просматривает в поиске включаемых файлов, то сценарий может получить путь к самому себе и использовать его для генерирования формы так:
include "Cookbook_Webutils.php";

$self_path = get_self_path ();
print ("<form action=\"$self_path\" method=\"POST\">\n");
# ... генерируем элементы формы...
print ("</form>\n");
Сценарии на Python могут получить путь к сценарию, импортируя модуль os
и обращаясь к члену SCRIPT_NAME объекта os.environ:
import os
print "<form action=\"" + os.environ["SCRIPT_NAME"] + "\" method=\"POST\">"
# ... генерируем элементы формы......
print "</form>"

Для страниц на JSP путь сценария доступен через неявный объект request, который становится доступным благодаря процессору JSP. Используйте метод объекта getRequestURI():

<form action="<%= request.getRequestURI () %>" method="POST">
<%-- ... генерируем элементы формы...--%>
</form>

Статьи по MySQL на эту тему:

Ведение журнала Apache с помощью MySQL
Выполнение поиска и получение результатов
Журнал доступа к веб-странице
Загрузка в форму записи базы данных
Использование ввода через Web для формирования запросов