Разработчику. Сборник рецептов PHP
Задавайте вопросы

Формы

Вернуться назад

Введение

Гениальность PHP – в той простоте, с которой он позволяет интегрировать в программу переменные форм. Это делает веб-программирование приятным и простым – от вывода формы и ее обработки до вывода результатов.

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

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

При обработке страницы PHP всегда устанавливает наличие переменных, пришедших с запросами GET или POST, загруженных файлов, допустимых cookies, а также переменных веб-сервера и окружения. После этого все эти данные становятся доступными посредством обращения к следующим массивам: $_GET, $_POST, $_FILES, $_COOKIE, $_SERVER и $_ENV. Они содержат, соответственно,cookies, веб-сервером и окружением. Кроме того, есть массив $_REQUEST, содержащий пришедшие от пользователя данные – GET, POST и cookies.

Если два массива содержат ключ с одним и тем же именем, то при размещении элементов внутри массива $_REQUEST PHP поступает в соответствии с параметром конфигурации variables_order. По умолчанию variables_order равна EGPCS (или GPCS, если используется файл конфигурации php.ini-recommended). Поэтому PHP сначала добавляет в массив $_REQUEST переменные окружения, а затем добавляет переменные GET, POST, cookie и переменные веб-сервера в указанном порядке. Например, если по умолчанию C идет после P, то cookie с именем username переписывает переменную POST с именем username.

Если у вас нет доступа к файлу конфигурации PHP, то проверить установку переменной можно с помощью функции ini_get():

print ini_get('variables_order');

EGPCS

Вам может потребоваться сделать это, поскольку ваш интернет-провайдер запрещает вам просматривать параметры конфигурации, или потому, что ваш сценарий, вероятно, запущен еще на каком-нибудь сервере. Эти параметры можно также просмотреть посредством функции phpinfo(). Однако если нельзя полагаться на значение опции variables_order, то надо обратиться непосредственно к массивам $_GET и $_POST, вместо того чтобы использовать массив $_REQUEST.

Массивы, содержащие внешние переменные, такие как $_REQUEST, являются суперглобальными. Это означает, что их не требуется объявлять как global внутри функции или класса. Это также означает, что, вероятно, вы не должны присваивать что-нибудь этим переменным, иначе вы перепишете хранимую в них информацию.

До версии PHP 4.1 эти суперглобальные переменные не существовали. Вместо них были обычные массивы с именами $HTTP_COOKIE_VARS, $HTTP_ ENV_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_POST_FILES и $HTTP_SERVER_VARS. Эти массивы все еще доступны в целях совместимости, но с новыми массивами работать проще. Эти более старые массивы заполняются, только если параметр конфигурации track_vars установлен в on, но начиная с версии PHP 4.0.3 эта возможность включена всегда.

В заключение, если параметр конфигурации register_globals установлен в on, все эти переменные также доступны как переменные глобального пространства имен. Поэтому $_GET['password'] – это одновременно и просто $password. Удобству при этом сопутствуют значительные проблемы безопасности, поскольку злоумышленные пользователи могут легко установить переменные извне и переписать внутренние переменные, которым вы, вроде бы, должны доверять. Начиная с версии PHP 4.2 параметр register_globals по умолчанию устанавливается в off.

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

<form action="/hello.php" method="post">
Как Ваше имя?
<input type="text" name="first_name">
<input type="submit" value="Поздоровайтесь">
</form>

Параметр name текстового элемента input внутри формы имеет значение first_name. Кроме того, в форме используется метод post. Это значит, что после отправки формы элемент $_POST['first_name'] будет содержать любую строку, которую напечатает пользователь. (Она может быть также пустой, если, конечно, ничего не было напечатано.)

Но давайте для простоты предположим, что в переменной находится допустимое значение. («Допустимое» может означать, в зависимости от обстоятельств, «непустое», «не заданное в попытке взломать систему» и т. д.) Это позволит нам пропустить важный этап проверки ошибок, но зато мы сможем представить этот простой пример. Итак, ниже показан простой сценарий hello.php для обработки формы:

echo 'Hello ' . $_POST['first_name'] . '!';

Если пользователя зовут Joe, то PHP печатает:

Hello Joe!

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ