HTML формы — сложные элементы интерфейса. Они включают в себя разные функциональные элементы: поля ввода и
. Каждому разделу можно присвоить название с помощью элемента .
Контактная информация
Имя
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"; отправляет скрытую копию на ваш адрес электронной почты.
Одной из наиболее часто встречающихся на практике задач является реализация формы обратной связи. Тобишь написание ее HTML кода, оформление ее на CSS, создание PHP скрипта, который бы обрабатывал полученные от пользователя данные и отправлял их на нашу почту, написание JS скрипта, который бы проверял форму на адекватность вводимых данных, защита нашего детища от спама, чтобы наш почтовый ящик не обвалился от атак ботов.
Все вышеперечисленные моменты будут рассмотрены в нашем обзоре и подробно прокомментированы.
Итак, начинаем создание формы обратной связи:
HTML
В первую очередь мы пишем HTML код, в нем задаются поля, которые будет заполнять пользователь. Они же в дальнейшем будут оформляться. Код формы выглядит следующим образом:
<
form method=
"post"
action=
"mail.php"
>
<
div class
=
"left"
>
<
label for
=
"name"
>
Имя:
label>
<
input maxlength=
"30"
type=
"text"
name=
"name"
/>
<
label for
=
"phone"
>
Телефон:
label>
<
input maxlength=
"30"
type=
"text"
name=
"phone"
/>
<
label for
=
"mail"
>
E-
mail
:
label>
<
input maxlength=
"30"
type=
"text"
name=
"mail"
/>
div>
<
div class
=
"right"
>
<
label for
=
"message"
>
Сообщение:
label>
<
textarea rows=
"7"
cols=
"50"
name=
"message"
>
textarea>
<
input type=
"submit"
value=
"Отправить"
/>
div>
form>
И визуально она выглядит сейчас следующим образом:
Согласен, пока все некрасиво и ничего не понятно, но мы только начали.
Рассмотрим приведенный выше код подробно:
<
form method=
"post"
action=
"mail.php"
>
…
form>
для того, чтобы создать форму необходимо использовать тег form. Именно он определяет начало и конец формы для интерпретатора кода. У него, как и у любого тега, есть целый набор атрибутов, но обязательных для работы формы всего два, это method (метод отправки запроса на сервер, для форм стандартно используют post) и action (указывает путь к файлу-обработчику формы, именно в этом файле будет содержаться скрипт на PHP, который после будет отправлять введенные пользователем значения нам на почту, в нашем случае мы видим, что это файл называется mail.php и лежит он в том же директории сайта, что и рассматриваемая нами страница).
<
input maxlength=
"30"
type=
"text"
name=
"name"
/>
Далее у нас следуют инпуты. Это собственно сами поля формы в которые пользователи будут вводить необходимую нам информацию (type="text" говорит о том, что это будет текст). Атрибут maxlength указывает сколько символов может ввести пользователь в данное поле формы. Самый важный атрибут это name – он задает имя конкретного поля. Именно по этим именам в дальнейшем PHP скрипт будет обрабатывать поступающую в него информацию. При желании можно еще задать атрибут placeholder, который выводит внутри поля текст исчезающий при установке курсора внутри нее. Одной из проблем плейсхолдера является то, что он не поддерживается некоторыми старыми браузерами.
<
label for
=
"name"
>
Имя:
label>
Используется в случае если мы отказались от плейсхолдеров. Обычная подпись поля, атрибут for сообщает к какому конкретно полю относится данная подпись. Значением указывается name интересующего нас поля.
<
textarea rows=
"7"
cols=
"50"
name=
"message"
>
textarea>
Также как и инпут предназначен для введения пользователем информации, только на этот раз поле заточено для длинных сообщений. Rows указывает размер поля в строках, cols в символах. В целом они задают высоту и ширину нашего поля.
<
input type=
"submit"
value=
"Отправить"
/>
О том, что это кнопка для отправки формы нам сообщает type="submit", а value задает текст, который будет внутри этой кнопки.
<
div class
=
"right"
>
div>
использованы только для дальнейшего визуального оформления формы.
CSS
Для того, чтобы наша форма обратной связи выглядела презентабельно ее нужно оформить. Для получения следующего результата:
Мы использовали данный код:
form {
background:
#f4f5f7;
padding:
20px;
}
form .
left,
form .
right {
display:
inline-
block;
vertical-
align:
top;
width:
458px;
}
form .
right {
padding-
left:
20px;
}
label {
display:
block;
font-
size:
18px;
text-
align:
center;
margin:
10px 0px 0px 0px;
}
input,
textarea {
border:
1px solid #82858D;
padding:
10px;
font-
size:
16px;
width:
436px;
}
textarea {
height:
98px;
margin-
bottom:
32px;
}
input[
type=
"submit"
]
{
width:
200px;
float:
right;
border:
none;
background:
#595B5F;
color:
#fff;
text-
transform:
uppercase;
}
Подробно расписывать CSS я не вижу смысла, обращу Ваше внимание лишь на ключевые моменты:
Не стоит писать оформление под каждый тег в форме. Старайтесь строить свои селекторы так, чтобы парой строк кода оформлять все необходимые Вам элементы.
Не используйте для переноса строк и создания отступов лишние теги по типу <
br>,
<
p>
и тд, с этими задачами прекрасно справляется CSS со свойством display: block и margin с padding. Больше о том, почему не стоит пользоваться <
br>
в верстке вообще можете почитать в статье Тэг br, а так ли он нужен? .
Не стоит пользоваться табличной версткой для форм. Это противоречит семантике этого тега, а поисковики любят семантичный код. Для того, чтобы формировать визуальную структуру документа нам достаточно тегов div, и заданных им в CSS свойств display: inline-block (выстраивает блоки в ряд) и vertical-align: top (не дает им разбежаться по экрану), задаем им необходимую высоту и вуаля, ничего лишнего и все расположено так, как нам нужно.
Для желающих экономить свое время на оформлении сайтов могу посоветовать пользоваться CSS фреймворками при создании сайтов, особенно самописных. Мой выбор в этом плане- Twitter Bootstrap . Урок по оформлению форм с его использованием можно посмотреть .
PHP
Ну вот и пришло время сделать нашу форму работоспособной.
Заходим в наш корневой каталог сайта и создаем там файл mail.php, к которому мы ранее указывали путь в атрибуте action тега form.
В конечном итоге его код будет выглядеть следующим образом:
Ваше сообщение успешно отправлено
\"
javascript: history.back()\"
>Вернуться назад "
;
if
(!
empty
($_POST
[
"name"
]
)
and !
empty
($_POST
[
"phone"
]
)
and !
empty
($_POST
[
"mail"
]
)
and !
empty
($_POST
[
"message"
]
)
)
{
$name
=
trim
(strip_tags
($_POST
[
"name"
]
)
)
;
$phone
=
trim
(strip_tags
($_POST
[
"phone"
]
)
)
;
$mail
=
trim
(strip_tags
($_POST
[
"mail"
]
)
)
;
$message
=
trim
(strip_tags
($_POST
[
"message"
]
)
)
;
mail
(,
,
"Вам написал: "
.
$name
.
" Его номер: "
.
$phone
.
" Его почта: "
.
$mail
.
"
Его сообщение: "
.
$message
,
)
;
echo
"Ваше сообщение успешно отправлено! Вы получите ответ в
ближайшее время $back
"
;
exit
;
}
else
{
echo
;
exit
;
}
?>
Обсуждение HTML и CSS части этого документа можно пропустить. По своей сути это обычная страница сайта, которую Вы можете оформить по своему желанию и необходимости. Рассмотрим же важнейшую ее часть – PHP скрипт обработки формы:
$back
=
"
\"
javascript: history.back()\"
>Вернуться назад
"
;
Этой строкой мы создаем ссылку для возвращения на предыдущую страницу. Поскольку мы заранее не знаем с какой страницы пользователь попадет на эту, то делается это при помощи маленькой JS функции. В дальнейшем мы просто будем обращаться к этой переменной для вывода ее в нужных нам местах.
if
(!
empty
($_POST
[
"name"
]
)
and !
empty
($_POST
[
"phone"
]
)
and !
empty
($_POST
[
"mail"
]
)
and !
empty
($_POST
[
"message"
]
)
)
{
//внутрення часть обработчика
}
else
{
echo
"Для отправки сообщения заполните все поля! $back
"
;
exit
;
}
Тут мы прикручиваем проверку формы на наполненность полей. Как вы догадались, в части $_POST["name"] в кавычках мы пишем значение атрибута name наших инпутов.
Если все поля заполнены, то скрипт начнет обрабатывать данные в своей внутренней части, если же хоть одно поле не было заполнено, то на экран пользователя выведется сообщение с требованием заполнить все поля формы echo "Для отправки сообщения заполните все поля! $back" и ссылкой для возврата на предыдущую страницу, которую мы создали самой первой строкой.
Дале вставляем во внутреннюю часть обработчика формы:
$name
=
trim
(strip_tags
($_POST
[
"name"
]
)
)
;
$phone
=
trim
(strip_tags
($_POST
[
"phone"
]
)
)
;
$mail
=
trim
(strip_tags
($_POST
[
"mail"
]
)
)
;
$message
=
trim
(strip_tags
($_POST
[
"message"
]
)
)
;
Таким образом мы очистили вводимые пользователем данные от html тегов и лишних пробелов. Это позволяет нам обезопасить себя от получения вредоносного кода в высылаемых нам сообщениях.
Проверки можно и усложнить, но это уже по вашему желанию. Минимальную защиту на серверной стороне мы уже поставили. Дальнейшее мы сделаем на стороне клиента используя JS.
Полностью отказываться от защиты формы на серверной стороне в пользу JS не рекомендую, поскольку хоть и крайне редко, но встречаются уникумы с отключенным в браузере JS.
После чистки тегов добавляем отправку сообщения:
mail
("почта_для_получения_сообщений@gmail.com"
,
"Письмо с адрес_вашего_сайта"
,
"Вам написал: "
.
$name
.
" Его номер: "
.
$phone
.
" Его почта: "
.
$mail
.
"
Его сообщение: "
.
$message
,
"Content-type:text/html;charset=windows-1251"
)
;
Именно эта строка и занимается формированием и отправкой сообщения к нам. Заполняется она следующим образом:
"почта_для_получения_сообщений@gmail.com" – сюда между кавычек вставляете свою почту
"Письмо с адрес_вашего_сайта" – это тема сообщения, которое будет приходить на почту. Можно написать сюда что угодно.
"Вам написал: ".$name." <
br />
Его номер: ".$phone." <
br />
Его почта: ".$mail." <
br />
Его сообщение: ".$message – формируем сам текст сообщения. $name – вставляем информацию заполненную пользователем через обращение к полям из предыдущего шага, в кавычках описываем что значит это поле, тегом <
br />
делаем перенос строки, чтобы сообщение в целом было читабельно.
Content-type:text/html;charset=windows-1251 - в конце идет явное указание типа данных передаваемого в сообщении и его кодировки.
ВАЖНО!
Кодировка указанная в «голове» документа ( <
meta http-
equiv=
"Content-Type"
content=
"text/html; charset=windows-1251"
/>
), кодировка из сообщения Content-type:text/html;charset=windows-1251 и в целом кодировка файла PHP должны совпадать иначе в получаемых на почту сообщениях вместо русских или английских букв будут выводиться «кракозябры».
Многие не указывают кодировку отправляемого сообщения явно, но на некоторых почтовых клиентах из-за этого в дальнейшем могут возникнуть проблемы (на почту приходят нечитабельные письма), потому я рекомендую ее все-же указывать.
Проверка формы на адекватность вводимых данных
Чтобы пользователи по невнимательности не промахивались полями и заполняли все корректно стоит поставить проверку вводимых данных.
Это можно сделать как на PHP на стороне сервера, так и на JS на стороне клиента. Я использую второй вариант, поскольку так человек сразу может узнать что он сделал не верно и исправить ошибку не делая дополнительных переходов по страницам.
Код скрипта вставляем в том же файле, где у нас располагается HTML часть формы. Для нашего случая он будет выглядеть так:
<
script>
function
checkForm(form)
{
var
name =
form.
name.
value;
var
n =
name.
match(/
^[
A-
Za-
zА-
Яа-
я ]
*
[
A-
Za-
zА-
Яа-
я ]
+
$/
)
;
if
(!
n)
{
alert("Имя введено неверно, пожалуйста исправьте ошибку"
)
;
return
false
;
}
var
phone =
form.
phone.
value;
var
p =
phone.
match(/
^[
0
-
9
+
]
[
0
-
9
-
]
*
[
0
-
9
-
]
+
$/
)
;
if
(!
p)
{
alert("Телефон введен неверно"
)
;
return
false
;
}
var
mail
=
form.
mail
.
value;
var
m =
mail
.
match(/
^[
A-
Za-
z0-
9
]
[
A-
Za-
z0-
9
\.
_-
]
*
[
A-
Za-
z0-
9
_]
*@
([
A-
Za-
z0-
9
]
+
([
A-
Za-
z0-
9
-
]
*
[
A-
Za-
z0-
9
]
+
)
*
\.
)
+
[
A-
Za-
z]
+
$/
)
;
if
(!
m)
{
alert("E-mail введен неверно, пожалуйста исправьте ошибку"
)
;
return
false
;
}
return
true
;
}
Ну а теперь обычный разбор:
Для того, чтобы при нажатии на кнопку отправки формы, у нас происходила ее проверка
вешаем запуск нашего скрипта на тег form:
<
form method=
"post"
action=
"mail.php"
onSubmit=
"return checkForm(this)"
>
Теперь по пунктам забираем состав проверки:
Как можете заметить такая мини проверка пишется для каждого нашего поля. Проверку на одно поле я выделил на скриншоте красным квадратом, у других полей она имеет аналогичную структуру и если возникнет необходимость добавить поле или убрать его, Вы теперь с легкостью сможете это сделать.
Сегодня будем работать над созданием красивой HTML формы обратной связи для сайта, работающей на PHP и имеющею встроенную защиту от спама. Никаких особых знаний вам не потребуется, достаточно будет основ html и элементарной логики. Я дам готовые файлы, которые вы сможете вставить на сайт без изменений или скорректировать под свои нужды.
Недавно я делал статью о том, как сделать с помощью плагина Contact Form 7. Также просто можно сделать форму обратной связи на Joomla и других популярных CMS.
Но, что делать сайтам, которые не используют популярные CMS? – Остается делать все руками.
Кроме того, использование обратной связи без плагинов возможно и для WordPress. Лишние плагины создают немалую нагрузку на сервера и отказ от них позволяет ускорить работу сайта.
Заказать установку и настройку готовой формы за 500 рублей можно здесь
(это для тех кому лень руками поработать или навыка недостаточно).
Принцип работы формы обратной связи на html Наша форма будет иметь 5 полей для ввода данных – имя, электронный адрес, телефон, адрес сайта, текст сообщения (вы сможете удалить или изменить их самостоятельно).
Все поля, кроме адреса веб сайта будут обязательны для заполнения (это вы тоже сможете настроить самостоятельно).
Для полей с email адресом и сайтом будет проводиться обязательная проверка правильности ввода данных.
Конечная форма связи будет иметь вот такой вид:
Для работы контактной формы, созданной на html, требуется 3 элемента.
Первый отвечает за структуру самой формы, за тип и количество полей ввода данных. Это обычный html код.
Второй отвечает за обработку данных, которые пользователь вводит в поля формы. Он определяет, что, куда и в каком виде пересылать, после того, как будет нажата кнопка отправки сообщения. Для реализации используется специальный PHP скрипт.
Третий отвечает за внешний вид. Устанавливает размеры и расположение полей ввода данных, добавляет различные цвета и эффекты. Это все задается CSS стилями.
Демо версия формы
Настройку каждого из этих элементов мы с вами разберем по шагам.
Создание HTML макета Чтобы не делать статью слишком длинной и не добавлять отдельно каждый элемент, я приведу полный html код, а ниже опишу каждый блок и возможные изменения.
Для обозначения форм в html используется тег
, внутри которого заполняются необходимые параметры.
Имя:
Email:
Правильный формат "name@something.com"
Телефон:
Правильный формат "+7-123-4567890"
Сайт:
Правильный формат "http://someaddress.com"
Текст сообщения:
Отправить сообщение
Имя:
"Введите ваше имя"
required />
Email:
"Введите электронный адрес"
required />
Телефон:
"Введите номер телефона"
required />
Правильный формат "+7-123-4567890"
Сайт:
"Введите адрес вашего сайта"
pattern
=
"(http|https)://.+"
/>
Правильный формат "http://someaddress.com"
Текст сообщения:
Отправить сообщение
Начнем с первой строки.
class=”contact_form”
– указываем класс, для того, чтобы в будущем задать CSS стили.
action=”contact-form.php”
– указываем название файла со скриптом, который будет обрабатывать данные формы и осуществлять отправку сообщения. Если файл лежит в той же папке, что и страница с формой, то достаточно указать только название файла, если в другой, то нужно будет указать и путь к файлу.
Дальше идут 4 блока
Отвечающих за вывод полей для ввода данных, по названиям понятно, какой за что отвечает. Сами поля выводятся с помощью тегов , внутри которого задаются следующие характеристики:
Type
– отвечает за тип вводимых данных, text – обычный текст, email – электронный адрес, такие поля автоматически проверяются на правильность (должна присутствовать @), tel – телефон, url – адрес сайта.
Name
– собственное название самого элемента, оно необходимо, что скрипт знал как использовать данные каждого поля. Если вы сделаете несколько полей одного типа, то вам необходимо каждому полю присвоить свое name.
Placeholder
– это подсказка, находящаяся внутри поля, текст, замещающий пустое поле элемента. Ее можно изменить или удалить, на работу формы она не влияет.
Required
– этот параметр указывает на то, что поле обязательно для заполнения. Вы можете самостоятельно решить, какие элементы обязательны, а какие нет.
pattern=”(http|https)://.+”
– эта конструкция служит для проверки корректности поля веб сайт, указывает на то, что адрес обязательно должен содержать http://текст
или https://текст
, в противном случае будет ошибка.
Для некоторых полей задана всплывающая подсказка, которая появляется при выборе элемента. Ее задет , где form_hint является классом элемента (его свойства прописываются в CSS). Текст во всплывающей подсказке для каждого поля контактной формы можно задать любой. Если такая фишка вам не нужна – просто удалите весь тег .
Поля для ввода самого сообщения размечается тегом , в котором cols задает количество символов поля в ширину, а rows число строк.
Защита от спама
– невидимое поле с именем name=bezspama. У него стоит стиль display:none – это значит поле невидимо людям, но боты его будут заполнять на автомате.
И завершающий элемент любой формы – кнопка отправки сообщения, она задается тегом , имеющим свой класс для настройки внешнего вида и тип “submit”.
Для добавления или удаления полей, достаточно убрать ненужные или вставить новые по аналогии с существующими, прописав для них все свойства и имена.
Оформление CSS стилями Если вы посмотрите в браузере на то, что получилось, то увидите нечто корявое и непривлекательное. Для того, чтобы у нас получилась красивая форма обратной связи, придется поработать над ее стилями (html будет недостаточно).
Если вы владеете CSS, то задать оформление для всех элементов формы сможете без проблем, тут даже не потребуется моя помощь.
Если же вы не знакомы со стилями, то я просто дам вам готовый файл, в котором уже все прописано таким образом, что ваша форма будет идентична той, что в примере.
Подключить стили можно двумя способами:
Скопировать содержимое файла в файл style.css, который уже есть на вашем сайте (добавьте в самый конец) Поместить файл, который я дал, на ваш хостинг и подключить его.
Подключаются файлы стилей следующим кодом , размещаемым внутри
. Если файл со стилями (styles.css) находится не в одной папке с html страницей, то пропишите полный путь до него.В файле со стилями, который я дал, каждый элемент подписан, поэтому, вы можете вносить в него любые изменения – менять цвета, размеры, форму, эффекты. Владея самыми базовыми знаниями, вы сможете легко его править.
Настройка PHP кода (добавлена защита от спама) Как и в случае со стилями, я дам вам готовый код, обрабатывающий HTML форму обратной связи и защищающий от спама. Этот файл адаптирован для конкретной конфигурации и, если вы захотите задать новые поля или удалить существующие, в него придется вносить изменения. Поэтому, я расскажу вам, как он работает, чтобы вы поняли, что нужно менять.
Для сайтов, использующих кодировку windows-1251 и версию php 5.4+, в код нужно будет внести дополнение, связанное с функцией htmlspecialchars. Покажу его ниже. Иначе, вместо кириллицы будут приходить пустые поля.
Помните, в свойствах формы (в html файле) мы указывали параметр action=”contact-form.php”. Вам нужно создать файл с названием contact-form.php и поместить в него находящийся ниже код.
\r\n Reply-To: $email \r\n";
if (mail($address, $sub, $mes, $from)) {
header("Refresh: 5; URL=https://сайт");
echo "
";}
else {
header("Refresh: 5; URL=https://сайт");
echo "
";}
}
exit; /* Выход без сообщения, если поле bezspama заполнено спам ботами */
?>
/* Задаем переменные */
$name
=
htmlspecialchars
($_POST
[
"name"
]
)
;
$email
=
htmlspecialchars
($_POST
[
"email"
]
)
;
$tel
=
htmlspecialchars
($_POST
[
"tel"
]
)
;
$website
=
htmlspecialchars
($_POST
[
"website"
]
)
;
$message
=
htmlspecialchars
($_POST
[
"message"
]
)
;
$bezspama
=
htmlspecialchars
($_POST
[
"bezspama"
]
)
;
/* Ваш адрес и тема сообщения */
$sub
=
"Сообщение с сайта ХХХ"
;
/* Формат письма */
$mes
=
"Сообщение с сайта ХХХ.\n
Имя отправителя: $name
Электронный адрес отправителя: $email
Телефон отправителя: $tel
Сайт отправителя: $website
Текст сообщения:
$message"
;
if
(empty
($bezspama
)
)
/* Оценка поля bezspama - должно быть пустым*/
/* Отправляем сообщение, используя mail() функцию */
$from
=
"From: $name <$email> \r\n Reply-To: $email \r\n"
;
if
(mail
($address
,
$sub
,
$mes
,
$from
)
)
{
header
()
;
echo
"
Письмо отправлено, через 5 секунд вы вернетесь на страницу XXX"
;
}
else
{
header
("Refresh: 5; URL=https://сайт"
)
;
echo
"
Письмо не отправлено, через 5 секунд вы вернетесь на страницу YYY"
;
}
exit
;
/* Выход без сообщения, если поле bezspama заполнено спам ботами */
Первым делом нам необходимо задать переменные, которые будут обрабатываться php кодом. Для того, чтобы не запутаться, присваиваем им такие же имена, как были в самой форме, только начинаются все переменные со знака $. Сама команда присвоения значения имеет такой вид:
$название = htmlspecialchars($_POST["название"]);
$
название=
htmlspecialchars
($
_POST
[
"название"
]
)
;
Если вы добавляли какие-то дополнительные поля данных, то в блоке переменных допишите их имена.
Не все переменные мы берем из формы. Как минимум, адрес электронной почты, на который придет письмо (ваш адрес) указывается отдельно. В данном случае это переменная $address – впишите в ее значение свой электронный ящик.
Также, в данном примере явным образом задано значение переменной $sub – она будет выдавать тему письма. Можно добавить тему сообщения в HTML форму в виде текстового поля (наподобие name), и брать значение этой переменной оттуда.
В блоке формат письма настраивается то сообщение, которое получите вы. Он может отличаться от того, что было написано в поле textarea под названием message. Я просто сделал еще одну переменную $mes и включил в нее дополнительный текст и важные данные отправителя (имя, почту, телефон, сайт). Эту часть вы можете сконфигурировать так, как вам удобно.
Чтобы получаемые вами письма подписывались именем отправителя, и в них включался их обратный адрес, а не адрес сервера, на котором находится ваш php файл, мы задаем новую переменную $from, в нее включаем имя и электронный ящик отправителя письма.
Затем функция mail осуществляет отправку письма по заданным параметрам. В случае успешной отправки появляется сообщение о том, что письмо отправлено, а через 5 секунд пользователя перебрасывает на страницу вашего сайта (адрес страницы и время задержки вы можете изменить). Если письмо отправить не удалось, появляется сообщение, что письмо не отправлено и через 5 секунд идет переход на страницу сайта, аналогичным образом вы можете задать адрес страницы и время.
Вставка формы на страницу сайта Для того, чтобы вставить созданную вами форму обратной связи, вам нужно скопировать html код формы и вставить его в ту часть кода страницы, где вы хотите вывести обратную связь для сайта.
Еще раз хочу напомнить, если файл с PHP программой находятся не в той же папке, что и страница, на которой размещен html код, то в коде самой формы нужно прописать полный путь к нему, иначе, работать не будет, так как форма не найдет файл обработчик.
Скачать файлы контактной формы
Активный анти спам с вводом данных в поле Спамеры действуют с помощью различных программных средств и некоторые боты умеют обходить защиту с пустым полем, которая встроена в базовую версию. Если они вас начинают донимать, то можно применить вместо или дополнительно простую защиту со вводом данных в специальное поле. Например, сделать математическое выражение с просьбой ввести ответ или задать какой-либо простой вопрос. Больших изменений в форме это не потребует.
Я покажу как изменить код формы и PHP обработчик для использования этого метода антиспама. При желании вы можете не менять защиту с пустым полем, а добавить соответствующие строки в код и у вас будет работать одновременно 2 метода – по идее, должно быть более эффективно.
Первым делом нам необходимо добавить поле для ввода и вопрос в HTML код. В качестве основы у нас уже есть строка 25 (input
name
=
“bezspama”
). Это поле невидимо. Мы превращаем его в обычное. Для этого всю строку меняем на вот такой блок:
2+2*2=:
У Вас в браузере заблокирован 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.78.4
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
Одной из самых востребованных функций на сайте является форма заявки или заказа, данные из которой отправляются на почту владельцу сайта. Как правило такие формы являются простыми и состоят из двух трех полей для ввода данных. Как же создать такую форму заказа? Здесь потребуется использование языка разметки HTML и языка программирования PHP.
Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.
Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.
Создаем форму отправки данных в html Первая строка будет следующей
Это очень важный элемент формы. В нем мы указываем каким способом будут передаваться данные и какому файлу. В данном случае все передачется методом POST файлу send.php. Программа в этом файле соответственно должна принять данные, они будут содержаться в post массиве, и отправить их на указанный email адрес.
Вернемся к форме. Вторая строка будет содержать поле для ввода ФИО. Имеет следующий код:
Тип формы text, то есть пользователь сможет ввести или скопировать сюда текст с клавиатуры. Под параметром name содержится название формы. В данном случае это fio, именно под таким именем будет передаваться все, что пользователь введен в данноу поле. Параметр placeholder указывает на то, что будет записано в этом поле в виде пояснения.
Следующая строка:
Здесь практически все то же самое, но имя для поля указано email, а пояснении указано, чтобы пользователь в эту форму ввел свой адресс электронной почты.
Следующей строкой будет кнопка "отправить":
И последней строкой в форме будет тэг
Теперь соберем все вместе.
Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:
Создаем файл, принимающий данные из HTML формы Это будет файл с именем send.php
В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:
$fio = $_POST["fio"]; $email = $_POST["email"];
Перед названиями переменных в php ставиться знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method="post". Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров - функций php.
Первая функция преобразует все символы, которые пользователь попытается добавить в форму:
При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
Вторая функция декодирует url, если пользователь попытается его добавить в форму.
$fio = urldecode($fio); $email = urldecode($email);
Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:
$fio = trim($fio); $email = trim($email);
Существуют и другие функции, позволяющие отфильтровать переменные php. Их использование зависит от того, насколько вы опасаетесь того, что злоумышленник попытается добавить программный код в данную форму отправки данных на почту html.
Проверка данных, передаваемых от HTML формы в файл PHP
Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:
echo $fio; echo " "; echo $fio;
Вторая строка здесь нужна для того, чтобы разделить вывод переменных php на разные строки.
Отправляем полученные данные из формы HTML на почту при помощи PHP Для отправки данных на почту нужно воспользоваться функцией mail в PHP.
mail("на какой адрес отправить", "тема письма", "Сообщение (тело письма)","From: с какого email отправляется письмо \r\n");
Например, нужно отправить данные на email владельца сайта или менеджера [email protected] .
Тема письма должна быть понятной, а сообщение письма должно содержать то, что указал пользователь в HTML форме.
mail("[email protected] ", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n");
Необходимо добавить условие, которе проверит отправилась ли форма при помощи PHP на указанные адрес электронной почты.
if (mail("[email protected] ", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")) { echo "сообщение успешно отправлено"; } else { }
Таким образом программный код файла send.php, который отправит данные HTML формы на почту будет выглядеть следующим образом:
$fio = $_POST["fio"]; $email = $_POST["email"]; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $fio = trim($fio); $email = trim($email); //echo $fio; //echo " "; //echo $email; if (mail("[email protected] ", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")) { echo "сообщение успешно отправлено"; } else { echo "при отправке сообщения возникли ошибки"; }?>
Три строки для проверки, передаются ли данные в файл закомментированы. При необходимости их можно удалить, так как они нужны были только для отладки.
Помещаем HTML и PHP код отправки формы в один файл
В комментариях к этой статье многие задают вопрос о том, как сделать, чтобы и HTML форма и PHP код отправки данных на почту находились в одном файле, а не двух.
Для реализации такой работы нужно поместить HTML код формы в файл send.php и добавить условие, которое будет проверять наличие переменных в массиве POST (этот массив передается из формы). То есть, если переменные в массиве не существуют, то нужно показать пользователю форму. Иначе нужно принять данные из массива и отправить их адресату.
Давайте посмотрим как изменить PHP код в файле send.php:
Форма заявки с сайта //проверяем, существуют ли переменные в массиве POST if(!isset($_POST["fio"]) and !isset($_POST["email"])){ ?>
} else { //показываем форму $fio = $_POST["fio"]; $email = $_POST["email"]; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $fio = trim($fio); $email = trim($email); if (mail("[email protected] ", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")){ echo "Сообщение успешно отправлено"; } else { echo "При отправке сообщения возникли ошибки"; } } ?>Существование переменной в POST массиве мы проверяем PHP функцией isset(). Восклицательный знак перед этой функцией в условии означает отрицание. То есть, если переменной не существует, то нужно показать нашу форму. Если бы я не поставил восклицательный знак, то условие дословно означало бы - "если существует, то показать форму". А это неправильно в нашем случае. Естественно, что вы можете переименовать его в index.php. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке
. Форма должна ссылаться на эту же страницу, например index.php. В код я добавил заголовок страницы.
Частые ошибки, возникающие при отправке PHP формы с сайта
Первая, наверное самая популярная ошибка, это когда вы видите пустую белую страницу без сообщений. Это означает, что вы допустили ошибку в коде страницы. Вам нужно включить отображение всех ошибок в PHP и тогда вы увидите, где допущена ошибка. Добавьте в код:
ini_set("display_errors","On"); error_reporting("E_ALL");
Файл send.php должен запускаться только на сервере, иначе код просто не будет работать. Желательно, чтобы это был не локальный сервер, так как он не всегда настроен на отправку данных на внешний почтовый сервер. Если вы запустите код не на сервере, то вам отобразиться код PHP прямо на странице.
Таким образом, для корректной работы я рекомендую поместить файл send.php на хостинг сайта. Там, как правило, все уже настроено.
Еще одна частая ошибка, когда появляется оповещение "Сообщение успешно отправлено", а письмо не приходит на почту. В этом случае нужно внимательно проверить строку:
if (mail("[email protected] ", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
Вместо
[email protected]
должен быть email адрес на который нужно отправить письмо, а вместо
[email protected]
должен быть существующий email данного сайта. Например для сайта сайт это будет
. Только в этом случае письмо с данными из формы будет отправлено.