В этом уроке PHP рассматриваются базовые понятия языка: обработка форм с отправкой запроса в веб-страницы, основные управляющие конструкции php при обработке форм, запись данных из формы PHP в файл, функция даты в PHP date().
1. Напомним, что все файлы php
тестируются только при запущенном Денвере
и только из адресной строки браузера. Запускать файлы php двойным щелчком нельзя!
2. Запустите Денвер.
В данном уроке PHP рассмотрим обработку формы на HTML-странице, создание переменных PHP для полей формы.
1. Создайте форму, как на рис. 3.1. Подразумевается, что при нажатии на кнопку Отправить заказ данные из формы будут переданы администратору, а клиент на экране увидит ответ Заказ обработан
. Если Вы затрудняетесь в написании формы, тогда реализуйте код, приведенный ниже рисунка, и сохраните его в папке php_2
под именем forma_bob.html
Напоминаем, что адрес обработчика формы записывается в атрибуте action
тега form
.
2. Для того, чтобы пользователь получил ответ после отправки данных, необходимо создать обработчик формы на языке php. Создайте код, приведенный ниже, и сохраните его в папке php_2
под именем zakaz.php
3. Проверьте работоспособность обработчика. Для этого запустите файл forma_bob.html
через браузер, набрав в адресной строке браузера адрес http://localhost/php_2/forma_bob.html
4. В поля формы введите любые цифры и нажмите кнопку Отправить заказ
. Результат на рис. 3.2.
Весь смысл использования формы заказа заключается в получении информации о заказе клиента, которую он ввел с клавиатуры. Внутри PHP-сценария к каждому из полей формы можно получить доступ как к переменной, имеющей то же имя, что и у поля формы. В языке PHP переменные легко распознать, так как они начинаются со знака доллара $
.
Мы будем использовать длинный стиль для ссылок на переменные формы, но для простоты использования строить короткие версии применения. Это удобный и безопасный способ манипулирования данными, который эффективно работает во всех системах, независимо от выбранных версий и настроек.
Копируя содержимое одной переменной в другую, мы применяем операцию присваивания, для обозначения которой в языке PHP используется знак равенства (=
). Приводимая ниже строка кода создает новую переменную с именем $tireqty
и переносит содержимое $_POST[‘tireqty’]
в эту новую переменную:
Так как этот сценарий не генерирует никаких выходных данных, нет никакой разницы, будет он помещен выше или ниже дескриптора
. Обычно этот блок размещается в начале сценария.
5. В файле zakaz.php
измените код следующим образом и проверьте работоспособность формы. Результат на рис. 3.3. Цифры могут отличаться в зависимости от того, какие данные Вы ввели.
В этом уроке 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
. Если затрудняетесь, то можете реализовать код, приведенный ниже.
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):
В нашем уроке PHP также рассматриваем запись данных из формы в текстовый файл и функцию даты date() при обработке формы.
1. В файле-обработчике формы «Автозапчасти об Боба» после последней закрывающей фигурной скобки добавьте код.
2. Проверьте работу программы. Текстовый файл orders.txt
создается автоматически, просмотрите его содержимое.
После изучения данного урока PHP предлагается выполнить контрольное задание для закрепления полученных знаний.
1. Создать форму, как на рис. 3.10.
2. Создать обработку формы, которая будет выводить результаты заказа, как на рис. 3.11 (результаты будут отличаться в зависимости от введенных в форму данных.
3. Результаты заказа должны записываться в отдельный текстовый файл.
HTML формы — сложные элементы интерфейса. Они включают в себя разные функциональные элементы: поля ввода и
. Каждому разделу можно присвоить название с помощью элемента .
Контактная информация
Имя
E-mail
Рис. 1. Группировка полей формы
Чтобы сделать форму более понятной для пользователей, в поля формы добавляют текст, содержащий пример вводимых данных. Такой текст называется подстановочным и создаётся с помощью атрибута placeholder .
Обязательные для заполнения поля также необходимо выделять. До появления HTML5 использовался символ звездочки * , установленный возле названия поля. В новой спецификации появился специальный атрибут required , который позволяет отметить обязательное поле на уровне разметки. Этот атрибут дает указание браузеру (при условии, что тот поддерживает HTML5), указание не отправлять данные после нажатия пользователем кнопки отправить, пока указанные поля не заполнены.
Для изменения внешний вид текстового поля при получении фокуса, используется псевдокласс focus . Например, можно сделать фон текущего поля более темным или добавить цветную рамку, чтобы оно выделялось среди остальных:
Input:focus {
background: #eaeaea;
}
Ещё один полезный html5-атрибут — атрибут autofocus . Он позволяет автоматически установить фокус на нужном начальном поле для элементов и (только в один элемент каждой формы).
Пример создания формы регистрации
Примечание
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:
Как видно
из приведенного фрагмента, в тегах форм
указываются два важных элемента: действие и
метод.
Действие
указывает,
какой сценарий должен обрабатывать форму, а
метод
определяет
способ передачи данных этому сценарию.
Существует два метода:
Метод get
передает все данные формы в конце URL. Из-за
различных ограничений, связанных со
спецификой языков и длиной данных, этот
метод применяется редко.
Метод post
передает все данные формы в теле запроса.
Этот метод используется чаще, чем get.
В
этой главе приведена лишь очень краткая
вводная информация по основному син-таксису
форм HTML. Более полную информацию можно
найти в книге А. Хоумера и К. Улмена «Dynamic HTML.
Справочник» (СПб.: Питер, 1999).
Элементы форм, ориентированные на ввод с клавиатуры
Наше
знакомство с построением форм начнется с
элементов, ориентированных на ввод с
клавиатуры. Таких элементов всего два --
текстовое поле (text box) и текстовая область (text
area).
Текстовое
поле
В текстовых
полях обычно вводится короткая текстовая
информация -- скажем, адрес электронной
почты, почтовый адрес или имя. Синтаксис
определения текстового поля:
Определение
текстового поля включает пять атрибутов:
type -- тип
элемента (для текстовых полей -- text);
size -- общий
размер текстового поля в браузере;
maxlength --
максимальное количество символов, вводимых
в текстовом поле;
value --
значение, отображаемое в текстовом поле по
умолчанию.
Текстовое
поле изображено на рис. 10.1.
Рис. 10.1.
Текстовое
поле
Особой
разновидностью текстовых полей является
поле для ввода паролей. Оно работает точно
так же, как обычное текстовое поле, однако
вводимые символы заменяются звездочками.
Чтобы создать в форме поле для ввода
паролей, достаточно указать type="password"
вместо type="text".
Текстовая
область
Текстовая
область (text area) используется для ввода
несколько больших объемов текста, не
ограничивающихся простым именем или
адресом электронной почты. Синтаксис
определения текстовой области:
Определение
текстового поля включает три атрибута:
name -- имя
переменной, в которой сохраняются
введенные данные;
rows --
количество строк в текстовой области;
cols --
количество столбцов в текстовой области.
Текстовая
область изображена на рис. 10.2.
Рис. 10.2.
Текстовая
область
Элементы форм, ориентированные на ввод с мыши
В других
элементах форм пользователь выбирает один
из заранее определенных вариантов при
помощи мыши. Я ограничусь описанием флажков,
переключателей и раскрывающихся списков.
Флажки (checkboxes)
используются в ситуациях, когда
пользователь выбирает один или несколько
вариантов из готового набора -- по аналогии
с тем, как ставятся «галочки» в анкетах.
Синтаксис определения флажка:
Определение
флажка включает три атрибута:
type -- тип
элемента (для флажков -- checkbox);
value --
значение, присваиваемое переменной по
умолчанию. Если флажок установлен, именно
это значение будет присвоено переменной с
указанным именем. Если флажок не установлен,
значение атрибута value не используется.
Флажок
изображен на рис. 10.3.
Рис. 10.3.
Флажок
Переключатель
Переключатель
(radio button) представляет собой разновидность
флажка; он работает практически так же за
одним исключением -- в любой момент времени
в группе может быть установлен лишь один
переключатель. Синтаксис определения
переключателя:
Как видите,
синтаксис почти не отличается от
определения флажка. Определение
переключателя поля включает три атрибута:
type -- тип
элемента (для переключателей -- radio);
name -- имя
переменной, в которой сохраняются
введенные данные (в данном случае --
состояние элемента);
value --
значение, присваиваемое переменной по
умолчанию. Если переключатель установлен,
именно это значение будет присвоено
переменной с указанным именем. Если флажок
не установлен, значение атрибута value не
используется.
Переключатель
изображен на рис. 10.4.
Рис. 10.4.
Переключатель
Раскрывающийся
список
Раскрывающиеся
списки особенно удобны в ситуации, когда у
вас имеется длинный перечень допустимых
вариантов, из которого пользователь должен
выбрать один вариант. Как правило,
раскрывающиеся списки применяются при
работе с относительно большими наборами
данных -- например, при перечислении
американских штатов или стран. Синтаксис
определения раскрывающегося списка:
Определение
переключателя поля включает три атрибута:
name -- имя
переменной, в которой сохраняются
введенные данные (в данном случае -- строка,
выбранная в списке);
value --
значение, отображаемое в списке по
умолчанию.
Раскрывающийся
список изображен на рис. 10.5.
Рис. 10.5.
Раскрывающийся
список
Скрытые поля
Скрытые поля
не отображаются в браузере и обычно
используются для передачи данных между
сценариями. Хотя передача в скрытых полях
работает вполне нормально, в PHP существует
другое, более удобное средство -- сеансовые
переменные (см. главу 13). Впрочем, скрытые
поля также используются в некоторых
ситуациях и потому заслуживают упоминания.
Синтаксис
определения скрытого поля практически
идентичен синтаксису текстовых полей,
отличается только атрибут типа. Поскольку
скрытые поля не отображаются в браузере,
привести пример на страницах книги
невозможно. Синтаксис определения скрытого
поля:
Определение
скрытого поля включает три атрибута:
type -- тип
элемента (для скрытых полей -- hidden);
name -- имя
переменной, в которой сохраняются скрытые
данные;
value --
значение, по умолчанию сохраняемое в
скрытом поле.
Вообще
говоря, название этого элемента -- скрытое
поле -- несколько неточно. Хотя скрытые поля
не отображаются в браузерах, пользователь
может просто выполнить команду View Source и
увидеть, какие скрытые значения хранятся в
форме.
Кнопка
отправки данных
Кнопка
отправки данных инициирует действие,
заданное атрибутом action тега
.
Синтаксис определения:
type -- тип
элемента (для кнопки отправки данных -- submit);
Рис. 10.6.
Кнопка
отправки данных
Кнопка
сброса
Кнопка
сброса отменяет все изменения, внесенные в
элементы формы. Обычно никто ею не
пользуется, однако кнопки сброса так часто
встречаются на формах в Web, что я решил
привести ее описание. Синтаксис
определения:
="
текст
_на_кнопке">
Определение
кнопки включает два атрибута:
type -- тип
элемента (для кнопки сброса -- reset);
value -- текст,
по умолчанию отображаемый на кнопке.
Кнопка
сброса выглядит точно так же, как и кнопка
отправки данных, если не считать того, что
на ней обычно выводится слово «Reset» (рис. 10.6).
Все вместе: пример формы
От описания
базовых компонентов форм мы переходим к
практическому примеру -- построению формы
для обработки данных, введенных
пользователем. Допустим, вы хотите создать
форму, в которой пользователь может
высказать мнение о вашем Сайте. Пример
такой формы приведен в листинге 10.1.
Листинг
10.1.
Пример
формы для сбора данных
Please take a
moment to tell us what you think about our site:
Name:
Email:
How frequently
do you visit our site?:
Site
frequency:
This
is my first time
<
1 time a month
Roughly
once a month
Several
times a week
Every
day
I"m addicted
I frequently
purchase the following products from our site:
Software
Cookware
Chef"s Hats
0ur site"s
greatest asset is:
Product selection
Cool design
Customer Service
Comments:
Внешний вид
формы в браузере изображен на рис. 10.7.
Рис. 10.7.
Пример
формы для ввода данных
Вроде бы все
понятно. Возникает вопрос -- как получить
данные, введенные пользователем, и сделать
с ними что-нибудь полезное? Этой теме
посвящен следующий раздел, «Формы и PHP».
Не забывайте:
все сказанное ранее -- не более чем вводный
курс. Приведенная информация ни в коем
случае не исчерпывает всех возможностей,
предоставляемых различными компонентами
форм. За дополнительной информацией
обращайтесь к многочисленным учебникам по
работе с формами, опубликованным в Web, а
также книгам по HTML.
От
предварительного знакомства с формами HTML
мы переходим к самому интересному --
применению PHP для обработки данных,
введенных пользователем в форме.
Формы и PHP
Обработка
данных в формах имеет много общего с
обработкой переменных, передаваемых в URL, --
эта тема подробно рассматривалась в
предыдущей главе.
Вводные примеры
Следующие
практические примеры помогут вам быстрее
освоить различные аспекты обработки форм в
PHP. В этих примерах продемонстрированы
разные подходы к реализации интерактивных
возможностей на сайте.
Пример 1:
передача данных формы из одного сценария в
другой
В первом
примере представлена характерная ситуация
-- когда пользовательские данные вводятся
на одной странице и отображаются на другой.
В листинге 10.2 приведен код формы для ввода
имени пользователя и адреса электронной
почты. Когда пользователь щелкает на кнопке
отправки данных (кнопка Go!), форма
обращается к странице, приведенной в
листинге 10.3. В свою очередь, листинг 10.3
выводит переменные $name и $mail, переданные с
запросом.
Листинг
10.2.
Простая
форма
Listing
10-2
Give us some
information!
Your Name:
Your Email:
Листинг
10.3.
Отображение
данных, введенных в листинге 10.1
Listing
10-3
// Вывести
имя и адрес электронной почты.
В общих
чертах происходит следующее: пользователь
заполняет поля формы и нажимает кнопку
отправки данных. Управление передается
странице, приведенной в листинге 10.3, где
происходит форматирование и последующее
отображение данных. Как видите, все просто.
Существует и
другой способ обработки данных форм, при
котором используется всего один сценарий. К
недостаткам этого способа относятся
увеличение сценария и как следствие --
затруднения с редактированием и
сопровождением. Впрочем, есть и достоинства
-- уменьшение количества файлов, с которыми
вам приходится работать. Более того, в этом
варианте сокращается избыточный код при
проверке ошибок (эта тема рассматривается
ниже в данной главе). Конечно, в некоторых
ситуациях работать с одним сценарием
неудобно, но, по крайней мере, вы должны
знать об этой возможности. В примере 2
воспроизводится пример 1, но с
использованием лишь одного сценария.
Пример 2:
альтернативная обработка формы (с одним
сценарием)
Обработка
данных формы в одном сценарии реализуется
относительно просто. Вы проверяете, были ли
присвоены значения переменным формы. Если
значения присвоены, сценарий обрабатывает
их (в нашем примере -- просто выводит), а если
нет -- отображает форму. Решение о том, было
ли задано значение переменной или нет,
принимается при помощи функции strcmp(),
описанной в главе 8. Пример реализации формы
с одним сценарием приведен в листинге 10.4.
Обратите внимание: атрибут action формы
ссылается на ту же страницу, в которой
определяется сама форма. Условная команда i
f проверяет состояние переменной скрытого
поля с именем $seenform. Если значение $seenform не
задано, форма отображается в браузере, а
если задано -- значит, форма была заполнена
пользователем и введенные данные
обрабатываются сценарием (в данном примере
-- просто выводятся в браузере).
Листинг
10.4.
Ввод
данных на форме в одном сценарии
Listing
10-4
// Все
кавычки внутри $form должны экранироваться,
Give us some
information!
Your Name:
Your Email:
// Для
проверки используется значение скрытой
переменной $seenform.
if ($seenform != "у"):
print "Hi. $name!.
Your email address is $email";
Учтите, что
этот вариант создает определенные
неудобства, поскольку при повторной
загрузке страницы пользователь ничего не
узнает о том, правильно ли были заполнены
поля формы. Процедура проверки ошибок
рассматривается далее в этой главе, а пока
достаточно запомнить, что ввод данных можно
осуществить при помощи одного сценария.
Теперь,
когда вы представляете, как просто
выполняются операции с формами, мы
переходим к интересному примеру --
автоматической отправке данных
пользователя по заданному адресу
электронной почты. Эта возможность
реализована в примере 3.
Пример 3:
автоматическая отправка данных по
электронной почте
Вывести
пользовательские данные в браузере
несложно, но вряд ли это можно назвать
содержательной обработкой
пользовательского ввода. Один из способов
обработки информации заключается в ее
отправке по электронной почте -- например,
администратору сайта. Хотя при помощи
гиперссылки mailto: можно отправить сообщение
прямо из браузера, следует учитывать, что
внешние приложения электронной почты
настроены не на каждом компьютере.
Следовательно, отправка сообщений с web-формы
более надежно гарантирует, что сообщение
будет доставлено адресату.
В следующем
разделе, mail(), создается небольшая форма, в
которой пользователь вводит информацию и
комментарии по поводу сайта. Затем данные
форматируются соответствующим образом и
передаются стандартной функции PHP mail(). Но
прежде чем переходить к построению формы,
необходимо предварительно рассмотреть
синтаксис функции mail().
Функция mail()
отправляет сообщение заданному адресату по
электронной почте. Синтаксис функции mail():
boolean
mail
(string получатель, string
тема, string сообщение [, string доп_заголовки])
В параметре
тема, как нетрудно предположить, передается
тема сообщения. Параметр сообщение
содержит текст сообщения, а необязательный
параметр доп_за головки предназначен для
включения дополнительной информации (например,
атрибутов форматирования HTML), пересылаемой
с сообщением.
В
системе UNIX функция mail() использует утилиту
sendmail. В Windows эта функция работает лишь при
наличии установленного почтового сервера
или если функция mail() связана с работающим
сервером SMTP. Эта задача решается
модификацией переменной SMTP в файле php.ini.
Если вы
сделали все необходимое и функция mail()
работает в вашей системе, попробуйте
выполнить следующий фрагмент (конечно,
адрес [email protected] заменяется вашим
настоящим адресом электронной почты):
$email = "[email protected] ";
$subject = "This is the subject";
$message = "This is the message";
$headers = "From: [email protected] ";
mail ($email, $subject,
$message, $headers);
Хотя при
обширной переписке, конечно, следует
использовать специализированные почтовые
программы вроде majordomo (http://www.greatcircle.com/majordomo),
в простых случаях функции PHP mail()
оказывается вполне достаточно.
Итак, после
знакомства с функцией mail() можно применить
ее на практике. В листинге 10.5 показано, как
получить информацию от пользователя и
отправить ее по адресу, заданному
администратором сценария.
Листинг
10.5.
Пересылка
пользовательских данных функцией mail()
Listing
10-5
// Все
кавычки внутри $form должны экранироваться.
// в
противном случае произойдет ошибка.
Send us your
comments!
Your Name:
Your Email:
Your Comments:
// Если форма
ранее не отображалась, отобразить ее.
//
Для
проверки используется значение скрытой
переменной $seenform.
if ($seenform != "у") :
print "$form";
else:
// Переменная
$recipient определяет получателя данных формы
$recipient = "[email protected] ";
// Тема
сообщения
$subject = "User
Comments ($name)";
//
Дополнительные заголовки $headers = "From: $email";
// Отправить
сообщение или выдать сообщение об ошибке
mail($recipient, $subject,
$comments, $headers) or die("Could not send email!");
// Вывести
сообщение для пользователя
print "Thank you
$name for taking a moment to send us your comments!";
Неплохо,
правда? Листинг 10.5 работает так же, как
листинг 10.4; сначала мы проверяем,
отображалась ли форма ранее. Если это
происходило, программа вызывает функцию mail() и пользовательские данные отправляются по
адресу, определяемому переменной $recipient.
Затем в браузере выводится
благодарственное сообщение для
пользователя.
Простейшим
расширением этого примера будет отправка
благодарственного сообщения по
электронной почте (вторым вызовом mail()).
Следующий пример развивает эту идею --
пользователю предлагается на выбор
несколько бюллетеней. Выбранные бюллетени
отправляются по электронной почте.
Пример 4:
отправка запрашиваемой информации по
электронной почте
В этом
примере в форме создается несколько
флажков, каждый из которых соответствует
отдельному документу с информацией о сайте.
Пользователь устанавливает один, два или
три флажка, вводит свой адрес, и
запрашиваемые брошюры отправляются ему по
электронной почте. Обратите внимание на
применение массива при работе с флажками --
это упрощает проверку выбранных флажков, а
также улучшает структуру программы.
Информационные
сообщения хранятся в отдельных файлах. В
нашем примере используются три текстовых
файла:
site.txt --
информация о сайте;
team.txt --
информация о талантливых разработчиках
сайта;
events.txt --
приглашение на очередное мероприятие.
Исходный
текст примера приведен в листинге 10.6.
Листинг
10.6.
Отправка
информации, запрашиваемой пользователем
Listing10-5
Receive
information about our site!
Your Email:
Site Architecture
Development Team
Upcoming Events
if ($seenform != "y")
:
print "$form";
else:
$headers = "From:
[email protected] ";
// Перебрать
все пары "ключ/значение"
while (list($key, Sval)
= each ($information)) :
// Сравнить
текущее значение с "у" if ($val == "у") :
// Построить
имя файла, соответствующее текущему ключу
$filename = "$key.txt":
$subject = "Requested
$key information";
// Открыть
файл
$fd = fopen ($filename,
"r");
// Отправить
сообщение
mail($email, $subject,
$contents, $headers) or die("Can"t send email!");; fclose($fd);
// Известить
пользователя об успешной отправке
print sizeof($information)."
informational newsletters
have been sent to
$email!";
В
листинге 10.6 мы перебираем пары «ключ/значение»
в цикле while и отправляем только те бюллетени,
у которых значение равно у. Следует помнить,
что имена текстовых файлов
должны
соответствовать ключам
массива
(site.txt, team.txt и
events.txt). Имя файла строится динамически по
ключу, после чего файл открывается по имени
и его содержимое загружается в переменную ($contents).
Затем переменная $contents передается функции
mail() в качестве параметра.
В следующем
примере пользовательские данные
сохраняются в текстовом файле.
Пример 5:
сохранение пользовательских данных в
текстовом файле
Пользовательские
данные сохраняются в текстовом файле для
последующего статистического анализа,
поиска и т. д. -- короче, любой обработки по
вашему усмотрению. В листинге 10.7, как и в
предыдущих примерах, данные формы
обрабатываются в одном сценарии.
Пользователю предлагается ввести четыре
объекта данных: имя, адрес электронной
почты, язык и профессию. Введенная
информация сохраняется в текстовом файле
user_information.txt. Элементы данных разделяются
символами «вертикальная черта» (|).
Листинг
10.7.
Сохранение
пользовательской информации в текстовом
файле
// Создать
форму
Give us your
personal info!
Your Name:
Your Email:
Your Preferred Language:
Choose
a language:
English
Spanish
Italian
French
Japanese
NewYork-ese
Your
Occupation:""ibr>
What
do you do?:
Student
Programmer
Project
Manager
Slacker
Gourmet
Chef
//
Заполнялась ли форма ранее? if ($seenform != "у")
:
print "$form";
else:
$fd = fopen("useMnformation.txt",
"a");
// Убедиться,
что во введенных данных не встречается
//
вертикальная черта.
$name = str_replace("|",
"", $name);
$email = str_replace("|",
"", $email);
// Построить
строку с пользовательскими данными
$user_row = $name."
".$email."|".$language." ".$job."\n";
fwrite($fd, $user_row)
or die("Could not write to file!");
print "Thank you
for taking a moment to fill out our brief questionnaire!":
Обратите
внимание на фрагмент, в котором мы
проверяем, что пользователь не включил в
имя или адрес электронной почты символы «вертикальная
черта» (|). Функция str_replace() удаляет эти
символы, заменяяих пустой строкой. Если бы
это не было сделано, пользовательские
символы | нарушили бы структуру файла
данных и существенно затруднили (а то и
сделали невозможным) его правильную
обработку.
При работе с
относительно малыми объемами информации
вполне можно обойтись текстовыми файлами.
Однако при большом количестве
пользователей или объеме сохраняемой
информации для хранения и обработки данных,
введенных в форме, лучше воспользоваться
базой данных. Эта тема подробно
рассматривается в главе 11.
До
настоящего момента предполагалось, что
пользователь всегда вводит правильные
данные и не действует злонамеренно. В
высшей степени оптимистичное
предположение! В следующем разделе мы
усовершенствуем рассмотренные примеры и
организуем проверку целостности данных
форм. Проверка ошибок не только
обеспечивает удаление неполной и
неправильной информации, но и обеспечивает
более эффективный и удобный интерфейс.
Проверка ошибок
Обработка
пользовательских данных дает осмысленный
результат лишь в том случае, если данные
имеют правильную структуру. Проверить
достоверность введенных данных невозможно,
однако вы можете проверить их целостность (например,
убедиться в том, что адрес электронной
почты соответствует стандартному шаблону).
Хотя для проверки данных часто применяется
технология JavaScript, могут возникнуть
проблемы с несовместимостью браузеров.
Поскольку код PHP выполняется на стороне
сервера, вы всегда можете быть уверены в том,
что проверка данных формы даст нужный
результат (конечно, при условии
правильности вашей программы).
При
обнаружении ошибки в данных необходимо
сообщить об этом пользователю и предложить
внести исправления. Существует несколько
возможных решений, в том числе простой
вывод сообщения об ошибке и предложение
альтернативных вариантов (например, если
пользователь выбирает имя, которое уже было
выбрано другим пользователем). В этом
разделе рассматривается процедура
проверки и вывода сообщений,
Пример 6:
вывод информации о пустых или ошибочно
заполненных полях формы
Ни один
разработчик сайта не захочет раздражать
пользователя невразумительными
сообщениями об ошибках в данных -- особенно
если пользователь запрашивает
дополнительную информацию о товаре или
оформляет покупку! Чтобы пользователь
понял, какие поля формы остались пустыми
или были заполнены неверно, сообщения
должны быть четкими и конкретными.
Мы
последовательно проверяем все поля формы и
убеждаемся в том, что они не остались
пустыми. Там, где это возможно, проверяется
правильность структуры введенных данных.
Если проверка прошла успешно, мы переходим
к следующему полю; в противном случае
программа выводит сообщение об ошибке,
устанавливает флаг, который позднее
используется для повторного отображения
формы, и переходит к следующему полю.
Процедура повторяется до тех пор, пока не
будут проверены все поля формы (листинг 10.8).
Листинг
10.8.
Проверка
данных формы и вывод сообщений об ошибках
Listing
10-8
// Создать
форму
Give us some
information!
Your Name:
Your Email:
//
Заполнялась ли форма ранее?
if ($seenform != "у"):
//
Пользователь заполнил форму. Проверить
введенные данные, else:
$error_flag =
"n";
// Убедиться
в том. что поле имени содержит информацию
if ($name ==
"") :
print "* You forgot to enter your name!
":
$error_flag = "y";
// Убедиться
в том. что поле адреса содержит информацию
if ($email ==
"") :
print "* You forgot to enter your email !
"
$error_flag = "y";
//
Преобразовать все алфавитные символы в
адресе
// электронной почты к нижнему
регистру
$email = strtolower(trim($email)):
// Убедиться в
правильности синтаксиса
// адреса
электронной почты
if (! @eregi("^+".
"(+\.)+".
"(){2.4}$". $email)) :
print "* You entered an invalid email address!
" :
$error_flag = "y";
// Если флаг
ошибки $error_flag установлен.
// заново
отобразить форму
if ($error_flag ==
"у") : print "$form";
// Обработать
данные пользователя
print "You entered
valid form information!";
Программа
в листинге 10.8 убеждается в том, что поля
имени и адреса электронной почты не
остались пустыми, а также проверяет
правильность синтаксиса вве-, денного
адреса. Если в результате каких-либо
проверок в форме обнаруживаются ошибки,
программа выводит соответствующие
сообщения
и
отображает
форму заново -- при этом вся введенная ранее
информация
остается
в
форме, благодаря чему пользователю будет
проще внести исправления. Если вывести
пустую форму и предложить пользователю
заполнить ее заново, он может отправиться
за
необходимым товаром или услугой в другое
место.
Динамическое конструирование форм
До
настоящего момента я программировал все
формы вручную. Любому программисту
известно, что ручное кодирование -- это
плохо, поскольку оно увеличивает
вероятность ошибок, не говоря уже о лишних
затратах времени.
В следующем
разделе я представлю сценарий, в котором
раскрывающийся список строится
динамически по содержимому массива. Этот
прием несложен, однако
он экономит
немало времени как при исходном
программировании, так и при последующем
сопровождении программы.
Пример 7:
построение раскрывающегося списка
Предположим,
у вас имеется список сайтов, которые вы
хотите порекомендовать посетителю из-за
классного дизайна. Вместо того чтобы жестко
кодировать каждую строку списка, можно
создать массив и воспользоваться его
содержимым для заполнения списка.
В листинге
10.9, как и в предыдущих примерах, реализован
вариант с одним сценарием. Сначала мы
проверяем, было ли присвоено значение
переменной $site. Если проверка дает
положительный результат, вызывается
функция header() с параметром, в котором
значение $site присоединяется к строке «Location:http://».
При передаче этой команды функция header О
перенаправляет браузер на указанный URL.
Если значение переменной $site не задано,
форма выводится в браузере. Раскрывающийся
список строится в цикле, количество
итераций зависит от размера массива Sfavsites. В
листинге 10.9 я включил в этот массив пять
своих любимых сайтов. Конечно, вы можете
добавить в него сколько угодно своих сайтов.
Запомните
одно важное обстоятельство -- функция header()
должна вызываться до вывода данных в
браузере. Ее нельзя просто вызвать в любой
точке сценария PHP. Несвоевременные вызовы
header() порождают столько проблем у неопытных
программистов PHP, что я рекомендую
повторить это правило раз пять, чтобы лучше
запомнить его.
Листинг
10.9.
Динамическое
построение раскрывающегося списка
if ($site !=
"") :
header("Location:
http://Ssite");
Listing
10-9
$favsites = array
("www.k10k.com". "www.yahoo.com",
"www.drudgereport.com",
"www.phprecipes.com",
"www.frogdesign.com"):
// Создать
форму
Choose a site:
while ($х < sizeof
($favsites)) :
print "$favsites[$x]";
Динамическое
конструирование форм особенно удобно при
обработке больших объемов данных, которые в
любой момент могут измениться, что приведет
к устареванию всей жестко закодированной
информации форм. Впрочем, я рекомендую
жестко кодировать все статические данные (например,
список штатов США), поскольку это ускорит
работу программы.
Проект: Пишем гостевую книгу на PHP
Прежде всего
создается инициализационный файл,
содержащий некоторые глобальные
переменные и функции приложения (листинг
10.10).
Листинг
10.10.
Файл
init.inc, используемый при создании гостевой
книги
// Файл: init.inc
// Назначение:
глобальные переменные и функции для
проекта гостевой книги
// Заголовок
страницы по умолчанию
$title = "My Guestbook";
// Цвет фона
$bg_color =
"white": /
// Гарнитура
шрифта
$font_face =
"Arial, Verdana, Times New Roman";
// Цвет
шрифта
$font_color =
"black";
// Дата
отправки $post_date - date("M d y");
// Файл
данных гостевой книги
$guest_file =
"comments.txt";
// Функция
читает данные гостевой книги
//и отображает
их в браузере
function view_guest($guest_file) {
GLOBAL $font_face,
$font_color;
print "Return to
index , ";
// Если в
файле гостевой книги имеются данные...
if
(filesize($guest_file) > 0) :
// Открыть
файл данных гостевой книги
$fh =
fopen($guest_file. "r") or die("Couldn"t open $guest_file");
print "
";
// Повторять
до конца файла
$line <= fgetsdfh, 4096);
// Разбить
строку на компоненты
// и
присвоить каждый компонент переменной
list($date. $name,
$email, $comments) = explode("|", $line):
// Если
указано имя посетителя, вывести его
if ($name !=
"") :
print
"
":
print
"
face=\"$font_face\">Date:
";
print
"
face=\"$font_face\">$date
";
print
"
";
print
"
";
print
"
face=\"$font_face\">Name:
";
print
"
face=\"$font_face\">$name
";
print
"
";
print
"
";
print
"
face=\"$font_face\">Email:
";
print
"
face=\"$font_face\">$email
";
print
"
";
print
"
";
print "
face=\"$font_face\">Message:
";
print
"
face=\"$font_face\">$comments
";
print "
";
print
"
 : ";
print
"
";
// Закрыть
файл
print
"
Currently there are no entries in the
guestbook! ";
// Функция
сохраняет новую информацию в файле данных
function
add_guest($name, $email, $comments) {
GLOBAL $post_date,
$guest_file;
//
Отформатировать данные для ввода,
$contents =
"$post_date|$name|$email |$comments\n";
// Открыть
файл данных
$fh =
fopen($guest_file. "a") or dieC"Could not open $guest_file!");
// Записать
данные в файл
$wr = fwrite($fh,
$contents) or die("Could not write to $guest_file!");
// Закрыть
файл fclose($fh);
Затем
создаются еще три файла: файл ссылок index.php,
файл add_guest.php для вывода информации гостевой
книги и файл view_guest.php для ввода новых данных.
Файл index.php (листинг 10.11) просто отображает
две ссылки для выполнения основных функций
гостевой книги -- просмотра и добавления
новых данных. Эти ссылки легко включаются в
сайт, имеющий более сложную структуру.
Листинг 10.11.
Файл index.php со ссылками для просмотра и
добавления новых данных в гостевую книгу
INCLUDE("init.inc");
=$page_title;?>
View the guestbook!
Sign the guestbook!
Файл view_guest.php
(листинг 10.12) выводит всю информацию
гостевой книги, хранящуюся в файле данных.
Листинг
10.12.
Файл
view_guest.php
INCLUDE("init.inc");
=$page_title;?>
vi ew_guest ($guest_file);
Файл add_guest.php
(листинг 10.13) запрашивает у пользователя
новые данные для внесения в гостевую книгу.
Введенная информация записывается в файл
данных.
Листинг
10.13.
Файл
add_guest.php
INCLUDE("init.inc");
=$page_title:?>
// Если форма
еще не отображалась - запросить данные у
пользователя
if (! $seenform) :
Comment:
// Форма уже
отображалась - добавить данные в текстовый
файл.
add_guest($name, $email,
$comment);
print
"
Your comments have been added to the guestbook.
Click here to return to the index.
";
К числу
основных преимуществ модульной разработки
приложений относится простота адаптации
для других систем. Допустим, вы решили
перейти от хранения данных в текстовом
файле к использованию базы данных. Стоит
изменить содержимое add_guest() и view_guest(), и ваша
гостевая книга перейдет на работу с базой
данных.
На рис. 10.8
показано, как выглядит гостевая книга после
сохранения пары записей.
Рис. 10.8.
Просмотр
гостевой книги (view_guest.php)
Информация,
показанная на рис. 10.8, хранится в файле
данных в следующем виде:
Oct 29
00|Michele|[email protected] |I love cheese!
Oct 29 00|Nino|[email protected] |Great
site!
Итоги
Обработка
данных форм принадлежит к числу сильнейших
сторон PHP, поскольку простота и надежность
сочетаются в ней с одним из важнейших
аспектов любого сайта -- интерактивностью.
В этой главе рассматривался широкий круг
вопросов, относящихся к формам и роли PHP в
обработке данных форм, в том числе:
общие
сведения о синтаксисе форм;
передача
данных форм между сценариями PHP;
обработка
форм в одном сценарии;
функция
mail();
отправка
данных формы по электронной почте;
автоматическая
обработка пользовательских запросов на
получение информации;
сохранение
данных пользователя в текстовом файле;
проверка
ошибок;
динамическое
конструирование форм.
Если вы
собираетесь работать со сколько-нибудь
заметными объемами информации, одним из
первых шагов на этом пути должна стать
интеграция базы данных в структуру сайта.
Эта тема рассматривается в следующей главе.
«PHP Form — работа с формами в PHP» – восьмой урок учебника PHP. В этом уроке мы поговорим про обработку форм средствами PHP.
Работа с формами
PHP позволяет обрабатывать данные, которые пользователь ввел в поля формы. После активации кнопки submit
данные отправляются на страницу – обработчик, указанную в поле action
элемента
. На странице – обработчике располагается PHP скрипт, который выполняет определенные операции над полученными данными, например формирует и отсылает письмо по указанным пользователем реквизитам.
Передача данных обработчику.
Данные из формы передаются на сервер как последовательность пар имя/значение
. Это значит, что имя каждого элемента формы (появляющееся в атрибуте NAME
тега) связывается со значением этого элемента (введенным или выбранным пользователем). Формат имя/значение
, используемый для передачи, имеет вид имя=значение
.
Все данные, передаваемые из формы в программу–обработчик располагаются в следующих суперглобальных массивах:$_GET
, $_POST
, и $_REQUEST
.
$_GET
- содержит все значения, передаваемые методом GET
.
$_POST
–содержит все значения, передаваемые методом POST
.
$_REQUEST
–содержит все значения, передаваемые методами POST
и GET
.
Фамилия:
Город:
Сообщение:
После нажатия на кнопку
submit
данной формы все данные передаются обработчику
process.php
. Так как в этой форме используется метод
POST
, то все переменные будут расположены внутри массива
$_POST
.
Теперь создадим обработчик:
echo «Имя: » . $_POST[«FName»] . « »;
echo «Фамилия: » . $_POST[«LName»] . « »;
echo «Город: » . $_POST[«City»] . « »;
echo « »;
echo «Ваше сообщение: » . $_POST[«Message»];
?>
Расположим этот файл внутри директории со страницей формы. Теперь при использовании формы данные передадутся обработчику, который выведет на экран сообщение, содержащее пользовательские данные.
Массив $_Request
Использование суперглобального массива
$_Request
очень удобно, особенно когда не известно, каким методом были переданы данные.
Благодаря циклу foreach
можно перебрать значения массива $_Request
.
В данном примере мы выводим на экран все значения массива $_Request
. Сделано это может быть для проверки правильности ввода данных пользователем. То есть пользователь вводит данные в форму, нажимает отправить, но вместо обработки данных у него на экране высвечивается сообщение с введенными им данными и надписью подтвердить или отказаться. Данная идея применена на многих сайтах, да и вообще во многих программах.
В данном уроке мы научились использовать PHP для обработки форм. Как вы можете видеть PHP является мощным инструментом обработки форм, позволяя производить самые разнообразные манипуляции над пользовательскими данными, такие, как сохранение данных о пользователе в базе данных для последующей авторизации, отправке сообщения на почту пользователя и многое другое.
В следующем уроке мы научимся проверять введенные пользователем данные перед непосредственной обработкой.
Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали о том, что такое сериализация в php . В данной статье я бы хотел рассказать о том, как работать с формами в PHP
. Язык PHP предназначен для программирования web-сценариев, и обработка форм занимает, пожалуй, самое главное место в этом процессе. Сейчас уже и не встретить сайтов, на которых не было бы, к примеру, регистрации или формы обратной связи, или опросника. Форумы, интернет-магазины, добавление комментария, отправка сообщения в социальной сети — всё это обработка данных, помещенных в поля формы. Давайте на примере разберемся, как обрабатывать формы на PHP
.
Будем реализовывать простую задачу: необходимо создать 2 поля (имя и фамилия), передать эти данные скрипту action.php
, в результате должно выйти приветствие "Добро пожаловать, фамилия имя"
. Кто забыл, как создаются формы, и какие там есть поля, можно посмотреть . Создадим файл test.html
:
Имя:
Фамилия:
Обращаю ваше внимание, что файл action.php
(в нашем случае) должен находиться в одной папке с файлом test.html
. Тут можно указывать как относительные, так и абсолютные пути. Будьте внимательны, многие ошибки связаны с неправильным указанием пути до скрипта-обработчика формы.
Создадим файл action.php
со следующим содержимым:
Если мы сейчас откроем файл test.html
, заполним поля формы и нажмём на кнопку, то попадём в файл action.php
, где будет выведено сообщение. В данном случае браузер обращается к скрипту action.php
и передает ему, через знак "?"
все значения атрибутов name
, расположенных внутри тегов
, разделенных символом &
. Обратите внимание, что подставляется вместо $_SERVER
.
Нашу задачу мы можем решить, разобрав строку QUERY_STRING
с помощью стандартных функций по работе со строками в PHP, но лучше воспользоваться другим механизмом — это использование массива $_REQUEST
. Все данные, которые получены из полей формы, PHP помещает в массив $_REQUEST, не зависимо от того, каким способом были переданы данные: POST или GET (узнать можно через $_SERVER["REQUEST_METHOD"]
). Напоминаю чем эти способы отличаются:
Метод GET является открытым, метод POST является закрытым, т.е. они отличаются способом передачи параметров. Пример:
1) Если мы используем метод post: mysite.ru/request.php.
2) Если мы используем метод get: mysite.ru/request.php?myname=»Alex»&surname=»Gulynin».
Также, помимо массива $_REQUEST, PHP создаёт массивы $_GET и $_POST
. Давайте теперь реализуем нашу задачу, на основе полученных знаний:
Если мы сейчас заполним форму и нажмём на кнопку, то увидим, что скрипт action.php
приветствует нас по фамилии и имени. Всё работает корректно.
Здесь всё хорошо, но если мы изменим название скрипта, то нужно будет вносить изменения в файл test.html
. Давайте модифицируем файл action.php, так, чтобы, обращаясь к нему либо выводилась форма, когда мы ничего не отправили, либо приветствие, когда мы нажали кнопку:
">
Имя:
Фамилия:
Теперь мы не зависим от имени скрипта, т.к. задаем его через переменную окружения $_SERVER["SCRIPT_NAME"]
. Конструкция =$_SERVER["SCRIPT_NAME"]?>
равнозначна конструкции .
Помимо переменной окружения SCRIPT_NAME
существует множество других.