Зачастую на Web – сайтах можно встретить страницы с
размещенными на них HTML - формами. Веб-формы – удобный способ получения
информации от посетителей вашего сайта. Пример тому – гостевая
книга , – которая обеспечивает обратную связь с посетителями и
разработчиками сайта. Формы так же удобны и для разработчиков сайта при
разработке CMS, которая позволяет поддерживать главное свойство сайта -
актуальность. Данная статья посвящена основам создания HTML-форм, их
обработке и способам передачи данных из экранных форм в
PHP-сценарии.
Главное отличие методов POST и GET заключается в способе
передачи информации. В методе GET параметры передаются через адресную
строку, т.е. по сути в HTTP-заголовке запроса, в то время как в методе
POST параметры передаются через тело HTTP-запроса и никак не отражаются на
виде адресной строки.
Если вы доверяете пользователям закачивать на ваш сервер
любые файлы, нужно быть предельно осторожным. Злоумышленники могут
внедрить «нехороший» код в картинку или файл и отправить на сервер. В
таких случаях нужно жестоко контролировать загрузку файлов.
Данный пример демонстрирует создание каталога и
копирование файла в этот каталог на сервер.
. Каждому разделу можно присвоить название с помощью элемента .
Контактная информация
Имя
E-mail
Рис. 1. Группировка полей формы
Чтобы сделать форму более понятной для пользователей, в поля формы добавляют текст, содержащий пример вводимых данных. Такой текст называется подстановочным и создаётся с помощью атрибута placeholder .
Обязательные для заполнения поля также необходимо выделять. До появления HTML5 использовался символ звездочки * , установленный возле названия поля. В новой спецификации появился специальный атрибут required , который позволяет отметить обязательное поле на уровне разметки. Этот атрибут дает указание браузеру (при условии, что тот поддерживает HTML5), указание не отправлять данные после нажатия пользователем кнопки отправить, пока указанные поля не заполнены.
Для изменения внешний вид текстового поля при получении фокуса, используется псевдокласс focus . Например, можно сделать фон текущего поля более темным или добавить цветную рамку, чтобы оно выделялось среди остальных:
Input:focus {
background: #eaeaea;
}
Ещё один полезный html5-атрибут — атрибут autofocus . Он позволяет автоматически установить фокус на нужном начальном поле для элементов и
Пример создания формы регистрации
HTML разметка
Примечание
action="form.php" — ссылка на файл обработчика формы. Создайте файл в кодировке UTF-8, закачайте его на сервер и замените action="form.php" на путь к файлу на вашем сервере.
Рис. 2. Внешний вид формы по умолчанию
Как видно из рисунка, каждый элемент формы имеет стили браузера по умолчанию. Очистим стили и оформим элементы формы.
Form-wrap {
width: 550px;
background: #ffd500;
border-radius: 20px;
}
.form-wrap *{transition: .1s linear}
.profile {
width: 240px;
float: left;
text-align: center;
padding: 30px;
}
form {
background: white;
float: left;
width: calc(100% - 240px);
padding: 30px;
border-radius: 0 20px 20px 0;
color: #7b7b7b;
}
.form-wrap:after, form div:after {
content: "";
display: table;
clear: both;
}
form div {
margin-bottom: 15px;
position: relative;
}
h1 {
font-size: 24px;
font-weight: 400;
position: relative;
margin-top: 50px;
}
h1:after {
content: "\f138";
font-size: 40px;
font-family: FontAwesome;
position: absolute;
top: 50px;
left: 50%;
transform: translateX(-50%);
}
/********************** стилизация элементов формы **********************/
label, span {
display: block;
font-size: 14px;
margin-bottom: 8px;
}
input, input {
border-width: 0;
outline: none;
margin: 0;
width: 100%;
padding: 10px 15px;
background: #e6e6e6;
}
input:focus, input:focus {
box-shadow: inset 0 0 0 2px rgba(0,0,0,.2);
}
.radio label {
position: relative;
padding-left: 50px;
cursor: pointer;
width: 50%;
float: left;
line-height: 40px;
}
.radio input {
position: absolute;
opacity: 0;
}
.radio-control {
position: absolute;
top: 0;
left: 0;
height: 40px;
width: 40px;
background: #e6e6e6;
border-radius: 50%;
text-align: center;
}
.male:before {
content: "\f222";
font-family: FontAwesome;
font-weight: bold;
}
.female:before {
content: "\f221";
font-family: FontAwesome;
font-weight: bold;
}
.radio label:hover input ~ .radio-control,
.radiol input:focus ~ .radio-control {
box-shadow: inset 0 0 0 2px rgba(0,0,0,.2);
}
.radio input:checked ~ .radio-control {
color: red;
}
select {
width: 100%;
cursor: pointer;
padding: 10px 15px;
outline: 0;
border: 0;
background: #e6e6e6;
color: #7b7b7b;
-webkit-appearance: none; /*убираем галочку в webkit-браузерах*/
-moz-appearance: none; /*убираем галочку в Mozilla Firefox*/
}
select::-ms-expand {
display: none; /*убираем галочку в IE*/
}
.select-arrow {
position: absolute;
top: 38px;
right: 15px;
width: 0;
height: 0;
pointer-events: none; /*активизируем показ списка при нажатии на стрелку*/
border-style: solid;
border-width: 8px 5px 0 5px;
border-color: #7b7b7b transparent transparent transparent;
}
button {
padding: 10px 0;
border-width: 0;
display: block;
width: 120px;
margin: 25px auto 0;
background: #60e6c5;
color: white;
font-size: 14px;
outline: none;
text-transform: uppercase;
}
/********************** добавляем форме адаптивность **********************/
@media (max-width: 600px) {
.form-wrap {margin: 20px auto; max-width: 550px; width:100%;}
.profile, form {float: none; width: 100%;}
h1 {margin-top: auto; padding-bottom: 50px;}
form {border-radius: 0 0 20px 20px;}
}
Файл form.php
" . "\r\n";
$headers .= "Bcc: ваш_email". "\r\n";
if(!empty($name) && !empty($sex) && !empty($email) && !empty($country) && filter_var($email, FILTER_VALIDATE_EMAIL)){
mail($email, $subject, $msg, $headers);
echo "Спасибо! Вы успешно зарегистрировались.";
}
?>
Примечание
В переменной $subject укажите текст, который будет отображаться как заголовок письма;
Ваше_имя — здесь вы можете указать имя, которое будет отображаться в поле «от кого письмо» ;
url_вашего_сайта замените на адрес сайта с формой регистрации;
ваш_email замените на ваш адрес электронной почты ;
$headers .= "Bcc: ваш_email". "\r\n"; отправляет скрытую копию на ваш адрес электронной почты.
В этом уроке PHP рассматриваются базовые понятия языка: обработка форм с отправкой запроса в веб-страницы, основные управляющие конструкции php при обработке форм, запись данных из формы PHP в файл, функция даты в PHP date().
1. Напомним, что все файлы php
тестируются только при запущенном Денвере
и только из адресной строки браузера. Запускать файлы php двойным щелчком нельзя!
2. Запустите Денвер.
Упражнение 1. Обработка простой формы
В данном уроке PHP рассмотрим обработку формы на HTML-странице, создание переменных PHP для полей формы.
1. Создайте форму, как на рис. 3.1. Подразумевается, что при нажатии на кнопку Отправить заказ данные из формы будут переданы администратору, а клиент на экране увидит ответ Заказ обработан
. Если Вы затрудняетесь в написании формы, тогда реализуйте код, приведенный ниже рисунка, и сохраните его в папке php_2
под именем forma_bob.html
Напоминаем, что адрес обработчика формы записывается в атрибуте action
тега form
.
Рисунок 3.1
2. Для того, чтобы пользователь получил ответ после отправки данных, необходимо создать обработчик формы на языке php. Создайте код, приведенный ниже, и сохраните его в папке php_2
под именем zakaz.php
3. Проверьте работоспособность обработчика. Для этого запустите файл forma_bob.html
через браузер, набрав в адресной строке браузера адрес http://localhost/php_2/forma_bob.html
4. В поля формы введите любые цифры и нажмите кнопку Отправить заказ
. Результат на рис. 3.2.
Рисунок 3.2
Переменные формы
Весь смысл использования формы заказа заключается в получении информации о заказе клиента, которую он ввел с клавиатуры. Внутри PHP-сценария к каждому из полей формы можно получить доступ как к переменной, имеющей то же имя, что и у поля формы. В языке PHP переменные легко распознать, так как они начинаются со знака доллара $
.
Вы можете получить доступ к содержимому поля tireqty
следующими способами:
$tireqty
//короткий стиль
$_POST[‘tireqty’]
//средний стиль
$HTTP_POST_VARS[‘tireqty’]
//длинный стиль
Мы будем использовать длинный стиль для ссылок на переменные формы , но для простоты использования строить короткие версии применения. Это удобный и безопасный способ манипулирования данными, который эффективно работает во всех системах, независимо от выбранных версий и настроек.
Копируя содержимое одной переменной в другую, мы применяем операцию присваивания, для обозначения которой в языке PHP используется знак равенства (=
). Приводимая ниже строка кода создает новую переменную с именем $tireqty
и переносит содержимое $_POST[‘tireqty’]
в эту новую переменную:
$tireqty=$_POST[‘tireqty’]
Так как этот сценарий не генерирует никаких выходных данных, нет никакой разницы, будет он помещен выше или ниже дескриптора
. Обычно этот блок размещается в начале сценария.
5. В файле zakaz.php
измените код следующим образом и проверьте работоспособность формы. Результат на рис. 3.3. Цифры могут отличаться в зависимости от того, какие данные Вы ввели.
Рисунок 3.3
Упражнение 2. Создание калькулятора для формы «Автозапчасти от Боба»
В этом уроке PHP рассмотрим основные арифметические функции PHP для расчетов.
1. Файл forma_bob.html
сохраните под именем forma_bob_2.html
2. Файл zakaz.php
сохраните под именем zakaz_2.php
3. В файле forma_bob_2.html
форму «Автозапчасти от Боба» измените так, чтобы она имела вид, как на рис. 3.4. Не забудьте изменить имя обработчика на zakaz_2.php
. Если затрудняетесь, то можете реализовать код, приведенный ниже.
Рисунок 3.4
4. Создайте новую обработку для формы в файле zakaz_2.php
, используя знания, полученные из предыдущих уроков. Обработка должна содержать следующие выходные данные и условия:
1. Стоимость каждого товара определяется константой. Константа на PHP задается функцией define. Пример define("POKRPRICE",10); Первый параметр функции - это имя константы, которое пишется прописными буквами , второй параметр - значение константы.
2. Логическая операция ИЛИ
обозначается ||
3. Логическая операция И
обозначается &&
.
4. Операции сравнения: больше >
, меньше <
, больше или равно >=
, меньше или равно <=
5. Функция, которая считывает время с компьютера date("H:i, j F")
6. Функция, которая форматирует количество знаков после запятой number_format
. Пример number_format($sumnalog,2)
. Первый параметр - переменная, у которой форматируем знаки, второй параметр - количество знаков после запятой.
7. Если Вы затрудняетесь с созданием обработки формы, может воспользоваться кодом, приведенным ниже (рис. 3.8):
Рисунок 3.8
Упражнение 3. Запись данных из формы в текстовый файл
В нашем уроке PHP также рассматриваем запись данных из формы в текстовый файл и функцию даты date() при обработке формы.
1. В файле-обработчике формы «Автозапчасти об Боба» после последней закрывающей фигурной скобки добавьте код.
Рисунок 3.9
2. Проверьте работу программы. Текстовый файл orders.txt
создается автоматически, просмотрите его содержимое.
КОНТРОЛЬНОЕ ЗАДАНИЕ
После изучения данного урока PHP предлагается выполнить контрольное задание для закрепления полученных знаний.
Рисунок 3.10
1. Создать форму, как на рис. 3.10.
2. Создать обработку формы, которая будет выводить результаты заказа, как на рис. 3.11 (результаты будут отличаться в зависимости от введенных в форму данных.
3. Результаты заказа должны записываться в отдельный текстовый файл.
Список заказа должен отражать следующее:
Вид товара.
Стоимость 1 шт. товара.
Количество заказанных товаров.
Общую стоимость заказа без доставки, налога на продажи и скидок.
Стоимость доставки.
Величину налога с продажи.
Скидку в процентах и рублях.
Стоимость заказа с учетом доставки, налога с продаж и скидки.
Адрес доставки.
Условия задачи:
Стоимость товаров:
ручки - 10 руб.
книги - 100 руб.
сувенира - 1000 руб.
компьютера - 10000 руб.
Налог с продаж - 18%. Налог прибавляется к общей стоимости всех товаров с учетом скидки.
Стоимость доставки - 500 руб. Стоимость доставки прибавляется к общей стоимости всех товаров в учетом скидки и налога с продаж.
Скидки:
При заказе ручек или книг меньше 5 шт. скидка - 5%, от 5 до 10 шт. - 10%, выше 10 шт. - 20%;
При заказе сувениров или компьютеров от 10 до 20 шт. скидка - 10%, от 20 до 30 шт. - 20%, выше 30 шт. - 40%.
В одной из прошлых тем уже рассматривалось получение данных из формы. В данной теме я подробнее расскажу,
как правильно осуществляется отправка формы на сервер, а также обработка формы в PHP.
Отправка формы
Поле для ввода.
Самыми распространёнными элементами формы являются различные поля для ввода. Они создаются при помощи
тэга
многих типов и тэга
1 2 3 4 5 6 7
8 9 10 11 12 13
Страница
select.
Из тэга
данные отправляются так: Атрибут
name
есть у самого этого тэга. А атрибут value
есть не у
тэга
, а у пунктов списка, то есть у тэгов
. Обычно у каждого пункта своё значение атрибута
value
. Какой пункт выберет пользователь, из такого пункта берётся значение параметра.
При этом, текст в тэге
не имеет значения, используется только
атрибут. Добавим в форму тэг
:
12 13 14 15 16 17 18
Интересы
Занятия спортом
Природа
Кино
Литература
Радиокнопка.
У всех радиокнопок из одной группы атрибут name
должен иметь одинаковое значение.
Это значение не только устанавливает имя параметра, но и объединяет радиокнопки в группу, из которой можно
выбрать только одну радиокнопку. Атрибут value
устанавливается разный. Добавим
радиокнопки в форму:
Чекбокс.
В отличие от радиокнопок, каждый чекбокс - это отдельный элемент формы. Все чекбоксы независимы друг от
друга и каждый отправляет свои данные на сервер. Атрибут name
у всех чекбоксов
должен быть разный, а атрибут value
может быть либо одинаковый, либо разный. Однако
у чекбокса нет каких-то конкретных данных. Он может быть либо выбран либо нет. Поэтому устанавливать ему
длинное значение нет смысла. Ему можно задать значение в один символ, например, 1. На сервере смысл этого
значения будет такой: если значение есть, то чекбокс был выбран, а если никакого значения нет, значит он
не выбран. Добавим чекбоксы в форму и создадим кнопку оправки формы:
Обработка данных из форм
В предложенном примере создана форма отправляющая данные скрипту с названием takeform.php. Поэтому нужно
создать этот скрипт. Это будет не просто программа, а страница, которая будет формироваться в зависимости от
данных, получаемых из формы. Форму отправляем методом POST. Скрипт берёт эти данные из суперглобального
массива $_POST
. Элементы массива можно просто использовать в скрипте, но если
с ними нужно много работать, то писать каждый раз название элемента неудобно. Проще записать
значение в переменную и обращаться к ней. Создадим файл takeform.php и запишем в переменные значения из
первых двух элементов формы:
takeform.php:
В тег
мы не добавили атрибут
value
. Если ничего не ввести в него то значение будет пустое. Часто бывает нужно
проверить, написал ли пользователь что-нибудь в поле для ввода. Для этого есть функция
empty()
, которая возвращает true
, если переменная
содержит пустое значение, а иначе возвращает false
. На странице, принимающей
данные из формы, сделаем проверку, было ли введено
что-то в
. Значение из него мы записали в
переменную $self
, её и проверим. Если она содержит значение, то добавим на
страницу блок и разместим в нём текст из переменной. Если переменная пустая, то блок создаваться не будет.
13 14 15 16 17
if (!empty($self))
{
echo "О себе:
";
echo "".$self."
";
}
select.
Текст из полей для ввода обычно используется сам по себе. Он записывается в базу данных или выводится
на страницу. Но данные из других элементов формы используются несколько по-другому. Получив данные из формы,
скрипт не выводит их, а определяет на их основе, какие действия нужно выполнять. Сформируем часть страницы
в зависимости от выбора пользователем пункта списка:
Обратите внимание, открывающий тэг
Идёт до обработки данных, в строке 19,
а закрывающий - в конце, в строке 28. Таким образом, на части разделён не только HTML код, но и конкретный
тэг. Это обычная практика.
Радиокнопка.
У всех радиокнопок одной группы одинаковый атрибут
value
. Соотвотсвоенно, для всей группы создаётся один элемент массива
$_POST
. В него будет записано значение из той радиокнопки, которую
выберет пользователь. Добавим на страницу результат выбора радиокнопки:
Чекбокс.
Каждый чекбокс обрабатывается отдельно. Обычно чекбокс не содержит конкретных данных, поэтому просто
проверяется содержит он значение или нет. Если значение есть, значит пользователь его выбрал и это учитывается
при обработке данных формы. Добавим на страницу информацию о том, что выбрал пользователь:
Так данные из форм отправляются на сервер и обрабатывабтся в PHP скриптах. В зависимости от разных задач,
работа с формами осуществляться иначе, но на основе приведённых примеров Вы сможете легко использовать
данные из форм так, как Вам нужно.
У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!
Работа с формами
Для передачи данных от пользователя Web-страницы на сервер используются
HTML-формы. Для работы с формами в PHP предусмотрен ряд специальных средств.
Предварительно определенные переменные
В PHP существует ряд предварительно определенных переменных, которые
не меняются при выполнении всех приложений в конкретной среде. Их также
называют переменными окружения или переменными среды. Они отражают установки
среды Web-сервера Apache, а также информацию о запросе данного браузера. Есть
возможность получить значения URL, строки запроса и других элементов
HTTP-запроса.
Все предварительно определенные переменные содержатся в ассоциативном
массиве $GLOBALS
. Кроме переменных окружения этот массив содержит
также глобальные переменные, определенные в программе.
Пример 1
Просмотр массива $GLOBALS
$value)
echo "\$GLOBALS[\"$key\"] == $value ";
?>
В результате на экране появится список всех глобальных переменных,
включая переменные окружения . Наиболее часто используемые из них:
Переменная
Описание
Cодержание
$_SERVER["HTTP_USER_AGENT"]
Название и версия клиента
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
$_SERVER["REMOTE_ADDR"]
IP-адрес
144.76.94.14
getenv("HTTP_X_FORWARDED_FOR")
Внутренний IP-адрес клиента
$_SERVER["REQUEST_METHOD"]
Метод запроса (GET
или POST
)
GET
$_SERVER["QUERY_STRING"]
При запросе GET
закодированные данные, передаваемые вместе с URL
$_SERVER["REQUEST_URL"]
Полный адрес клиента, включая строку запроса
$_SERVER["HTTP_REFERER"]
Адрес страницы, с которой был сделан запрос
$_SERVER["PHP_SELF"]
Путь к выполняемой программе
/index.php
$_SERVER["SERVER_NAME"]
Домен
сайт
$_SERVER["REQUEST_URI"]
Путь
/php/php_form.php
Обработка ввода пользователя
PHP-программу обработки ввода можно отделить от HTML-текста, содержащего
формы ввода, а можно расположить на одной странице.
Пример 2
Пример обработки ввода
" method="post">
Номер карточки:
Здесь отсутствует кнопка передачи данных, т.к. форма, состоящая из одного
поля, передается автоматически при нажатии клавиши .
При обработки элемента с многозначным выбором для доступа ко всем выбранным
значениям нужно к имени элемента добавить пару квадратных скобок. Для выбора нескольких эллементов следует удерживать клавишу Ctrl.
Пример 3.1
Список
Чай
Кофе
Молоко
Ветчина
Сыр
РЕЗУЛЬТАТ ПРИМЕРА 3.1:
Чай
Кофе
Молоко
Ветчина
Сыр
Пример 3.2
Обработка списка из файла ex1.htm
";
foreach ($Item as $value) echo "$value";
echo " ";
?>
Пример 4. Прием значений от checkbox-флажков
$v) {
if($v) echo "Вы знаете язык программирования $k! ";
else echo "Вы не знаете языка программирования $k. ";
}
}
?>
" method="post">
Какие языки программирования вы знаете?
PHP
Perl
РЕЗУЛЬТАТ ПРИМЕРА 4:
Какие языки программирования вы знаете?
PHP
Perl
Пример 5
";
?>
" method="post">
< ?=@htmlspecialchars($_REQUEST["text"])?>
Можно обрабатывать формы, не заботясь о фактических именах полей.
Для этого можно использовать (в зависимости от метода передачи)
ассоциативный массив $HTTP_GET_VARS
или $HTTP_POST_VARS
.
Эти массивы содержат пары имя/значение для каждого элемента переданной формы. Если Вам все равно,
Вы можете использовать ассоциативный массив $_REQUEST
.
Пример 6
Обработка произвольного ввода
независимо от метода передачи
$value)
echo "$key == $value ";
?>
Пример 7. Обработка нажатия на кнопку с использованием оператора "@".
">
С помощью функции header()
, послав браузеру заголовок
"Location"
, можно перенаправить пользователя на новую страницу.
Например:
header("Location: ex2.php"); ?>
Передача файла на сервер. Залить файл. UpLoad
PHP позволяет передавать на сервер файлы. HTML-форма, предназначенная для
передачи файла, должна содержать аргумент enctype="multipart/form-data"
.
Кроме того в форме перед полем для копирования файла должно находиться
скрытое поле с именем max_file_size
. В это скрытое поле должен
быть записан максимальный размер передаваемого файла (обычно не больше 2 Мбайт).
Само поле для передачи файла - обычный элемент INPUT
с аргументом type="file"
.
Например:
" method="post">
После того, как файл передан на сервер, он получает уникальное имя и
сохраняется в каталоге для временных файлов. Полный путь к файлу записывается в
глобальную переменную, имя которой совпадает с именем поля для передачи этого
файла. Кроме этого PHP сохраняет еще некоторую дополнительную информацию о
переданном файле в других глобальных переменных:
Пример 8
Обработка переданного файла
";
echo "имя: ".$_FILES["userfile"]["name"]." ";
echo "размер: ".$_FILES["userfile"]["size"]." ";
echo "тип: ".$_FILES["userfile"]["type"]." ";
}
?>
" method="post">
Примеры загрузки файлов на сервер
Если возникнут проблеммы с перекодировкой сервером загруженного файла, символ с кодом 0х00
заменен на пробел
(символ с кодом 0х20
),
допишите в файл httpd.conf
из каталога Апача (/usr/local/apache) следующие строки.
CharsetRecodeMultipartForms Off