Форма отправки электронной почты
На этот раз мы создадим простую и часто используюмую форму отзывов клиентов (форму обратной связи), позволяющую клиентам компании АВС вводить свои замечания и пожелания. Наше приложение будет обладать одним преимуществом по сравнению сдругими формами, которые можно встретить. Вместо того чтобы отправлять форму по обобщенному адресу электронной почты типа [email protected], мы постараемся сделать этот процесс более интеллектуальным за сче поиска во вводимых данных ключевых слов и выражений и последующей отправки сообщения электронной почтой соответствующему сотруднику компании. Например, если сообщение электронной почты содержит слово "advetising" (реклама), данные обратной связи будут направлены в отдел маркетинга. Если сообщение электронной почты поступает от самого крупного клиента, оно должно быть направлено руковолителю компании.
Форма обратной связи с клиентами postoffice.php
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС</title>
</head>
<body>
<h2>Компания АВС</h2>
<h3>Обратная связь</h3>
<table width="100%" border="0">
<form action="process.php" method="post">
<tr>
<td>Фамилия, имя</td>
</tr>
<tr>
<td><input name="name" type="text" size="25"></td>
</tr>
<tr>
<td>Адрес e-mail</td>
</tr>
<tr>
<td><input name="email" type="text" size="25"></td>
</tr>
<tr>
<td>Ваше сообщение</td>
</tr>
<tr>
<td><textarea name="feedback" cols="50" rows="10"></textarea></td>
</tr>
<tr>
<td><input name="input" type="submit" value="Отправить сообщение"></td>
</tr>
</form>
</table>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Создадим сценарий для обработки формы и по мере изучения материала будем дополнять его.
process.php — основной сценарий для создания содержимого формы отправки электронной почты
<?php
//Создание коротких имен переменных
$name = $_POST['name'];
$email = $_POST['email'];
$feedback = $_POST['feedback'];
$toaddress = '[email protected]';
$subject = 'Обратная связь от веб-сайта';
$mailcontent = 'ФИО клиента: '.$name. "\n"
.'E-mail-адрес клиента: '.$email."\n"
."Комментарий клиента: \n" .$feedback. "\n";
$fromaddress = 'From: [email protected]';
mail ($toaddress, $subject, $mailcontent, $fromaddress);
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС</title>
</head>
<body>
<p>Ваше сообщение отправлено</p>
</body>
</html>
Обратите внимание, что в общем случае необходимо проверить, заполнил ли пользователь все обязательные поля формы, воспользовавшись для этой цели цели, например функцией isset ()
. Для краткости изложения в приведенном сценарии и других примерах мы будем опускать эту процедуру.
Нетрудно убедиться, что в этом сценарии мы выполнили конкатенацию полей формы и при помощи функции mail ()
отправили их по электронной почте по адресу [email protected]
. До сих пор функция mail ()
нами не использовалась, поэтому рассмотрим ее работу.
Эта функция отправляет сообщения электронной почты. Ее прототип имеет следующий вид:
bool mail (string кому, string тема, string сообщение [, string дополнительные заголовки [, string дополнительные параметры] ] );
Первые три параметра являются обязательными и представляют, соответственно, адрес, по которому должно быть отправлено сообщение, строку темы и содержимое сообщения. Четвертый параметр может применяться для отправки любых дополнительных заголовков сообщений электронной почты. В данном примере четвертый параметр используется для включения в сообщение адреса "From:" ("От:")
для указания отправителя. Его можно также применять для добавления таких полей, как "Reply-To:" ("Ответить:")
и "Сс:" ("Копия:")
. Если вам необходимо ввести более одного дополнительного заголовка, их нужно разделить символами новой строки (\n
), как показано ниже:
$additional_headers = "From: [email protected]\n"
.'Reply_To: [email protected]';
Необязательный пятый параметр может быть использован для передачи параметра в программу, которая сконфигурирована для отправки электронной почты.
Чтобы можно было пользоваться функцией mail ()
, при настройке РНР потребуется указать применяемую программу передачи электронной почты.
Далее мы будем совершенствовать этот сценарий за счет добавления соответствующих функций обработки строк и регулярных выражений РНР.
Форматирование строк
Часто строки, вводимые пользователем (как правило, в интерфейс с HTML-формой), приходится очищать от служебных символов, прежде чем их можно будет использовать по прямому назначению. Далее описаны функции, которые служат для этих целей.
Усечение строки: функции chop (), ltrim () и trim()
Первый шаг в этом направлении предусматривает удаление лишних пробелов. Хотя этот шаг и не обязателен, он может оказаться полезным, если предполагается хранение строки в файле или базе данных либо ее сравнение с другими строками.
Для упомянутой цели в РНР предусмотрены три полезные функции. Функция trim ()
служит для приведения приводимых данных в порядок:
$name = trim ($name);
$email = trim ($email);
$feedback = trim ($feedback);
Функция trim ()
удаляет пробелы в начале и в конце строки и возвращает результирующую строку. При этом символами, которые она удаляет, по умолчанию считаются символы строки (\n
), возврата каретки (\t
) и вертикальной табуляции (\x0B
), конца строки (\0
) и обычные пробелы. Мы можем также указать второй параметр, который содержит список символов, подлежащихь удалению из строки, вместо списка по умолчанию. В зависимости от конкретно преследуемой цели вместо этой функции можно использовать ltrim ()
или rtrim ()
. Обе они аналогичны функции trim ()
в том, что принимают редактируемую строку в качестве параметра и возвращают отформатированную строку. Различие между ними состоит в том, что функция trim ()
удаляет пробелы в начале и конце строки, ltrim()
удаляет пробелы только в начале строки (слева), а rtrim ()
— только в конце строки (справа).
Форматирование строк для целей представления
В РНР имеется набор функций, которые можно использовать для переформатирования строк различными способами.
Использование HTML-форматирования: функция nl2br ()
Функция nl2br ()
принимает строку в качестве параметра и заменяет в ней все символы новой строки XHTML-дескриптором <br/>
(или HTML-дескриптором <br>
в версиях РНР, предшествующих 4.0.5)ю Данная возможность полезна при выводе длинной строки в окне браузера. Например, мы воспользовались этой функцией для форматирования данных обратной связи с клиентами при выводе их на экран.
Скорректируем код сценария process.php и добавим следующие строки:
<?php
//Создание коротких имен переменных
$name = $_POST['name'];
$email = $_POST['email'];
$feedback = $_POST['feedback'];
$toaddress = '[email protected]';
$subject = 'Обратная связь от веб-сайта';
$mailcontent = 'ФИО клиента: '.$name. "\n"
.'E-mail-адрес клиента: '.$email."\n"
."Комментарий клиента: \n" .$feedback. "\n";
$fromaddress = 'From: [email protected]';
mail ($toaddress, $subject, $mailcontent, $fromaddress);
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС</title>
</head>
<body>
<h2>О вашем сообщении</h2>
<h3>До вызова функции nl2br ()</h3>
<p>Ваше сообщение отправлено</p>
<p><?php echo $mailcontent;?></p>
<h3>После вызова функции nl2br ()</h3>
<p>Ваше сообщение отправлено</p>
<p><?php echo nl2br ($mailcontent );?></p>
</body>
</html>
Откроем страницу с формой, заполним ее и нажмем кнопку Отправить сообщение.
В окне веб-браузера это будет выглядеть ТАК.
HTML игнорирует обычные пробелы, поэтому если вы не отфильтруете этот вывод с помощью функции nl2br (), он появится на экране в виде одной сплошной строки (за исключением символов новой строки, расставленных самим браузером).
Форматирование строк для печати
До сих пор мы использовали языковую конструкцию echo
для вывода строк в окне браузера. РНР поддерживает также языковую конструкцию print ()
, которая выполняет ту же операцию, что echo
, при этом возвращает значение true
или false
, в зависимости от того, успешно ли она выполнена.
Обе конструкции выводят строку "как она есть". С помощью функций printf ()
и sprintf (
) можно выполнять более сложное форматирование. Фактически эти функции реализуют одни и те же действия, однако printf()
выводит отформатированную строку в окне браузера, а sprintf ()
возвращает только сформатированную строку.
Прототипы этих функций имеют следующий вид:
string sprintf (string формат [, mixed aргументы ... ] )
void printf (string формат [, mixed аргументы ... ] )
В качестве первого параметра этим функциям передается строка формата, описывающая основную форму вывода, в которой вместо переменных используются коды форматирования. Остальными параметрами являются переменные, которые будут подставляться в строку формата.
Например, в операторе echo
можно указывать переменные, которые должны быть выведены, например, так:
echo "Общая сумма заказа: $total.";
Для получения того же результата с помощью функции printf ()
применяется следующая конструкция:
printf ("Общая сумма заказа: %s.", $total );
Последовательность символов %s
в строке формата называется спецификацией преобразования. Указанная спецификация означает "заменить строкой". В рассматриваемом случае она будет заменена значением переменной $total
, которое интерпретируется как строка.
Если бы значением, хранящимся в переменной $total
, было 20, 4 в обоих этих случаях выводилось бы 20.4.
Преимущество printf ()
состоит в том, что в этом случае можно использовать более удобную спецификацию преобразования, чтобы указать, что на самом деле переменная $total
является числом с плавающей точкой и что, оно должно содержать два знака после десятичной точки, как показано в следующем примере:
printf ("Общая сумма заказа: %.2f", $total);
С учетом заданного форматирования и значения 20.4 переменной $total, на экран будет выведено 20.40.
Строка формата может содержать несколько спецификаций преобразования. При использовании n спецификацией преобразования после строки формата необходимо указать n аргументов. Каждая спецификация преобразования будет замещена переформатированным аргументом в том порядке, в каком они перечислены. Например:
printf ("Общая сумма заказа: %.2f (с доставкой: %.2f) ",
$total, $total_shipping);
В рассматриваемом случае первая спецификация преобразования использует переменную $total
, а вторая — переменную $total_shipping
.
Все спецификации преобразования имеют одинаковый формат:
%[ 'дополняющий_сивол' ] [-] [ ширина ] [ .точность] тип
Все спецификации преобразования начинаются с символа %
. Если мы хотим распечатать символ %
, следует воспользоваться последовательностью %%
.
Дополняющий_символ не относится к числу обязательных параметров. Он будет использоваться для дополнения переменной до указанной ширины. Примером служить добавление ведущих нулей к такому числу, как значение счетчика. Дополняющим символом по умолчанию является пробел. Если указать пробел или 0, предварять его одинарной кавычкой ('
) не нужно. Все остальные символы должны предваряться одинарной кавычкой.
Символ "-"
является необязательным. Он указывает, что данные в поле будут выравниваться по левому краю, а не по правому, как определено по умолчанию.
Параметр ширина указывает функции printf ()
, сколько места (в символах) необходимо для подстановки значения переменной в соответствующее место строки.
Параметр точность должен начинаться с десятичной точки. Он определяет количество отображаемых десятичных знаков после запятой.
Последним параметром спецификации является код типа.
Тип | Описание |
---|---|
b | Интерпретируется как целое число и выводится как двоичное число. |
c | Интерпретируется как целое число и выводится как символ. |
d | Интерпретируется как целое число и выводится как десятичное число. |
f | Интерпретируется как целое число двойной точности и выводится как число с плавающей точкой. |
o | Интерпретируется как целое число и выводится как восьмеричное число. |
s | Интепретируется как строка и выводится как строка. |
u | Интерпретируется как целое число и выводится как десятичное число без знака. |
x | Интерпретируется как целое число и выводится как шестнадцатитеричное число с представлением цифр a-f строчными буквами. |
X | Интерпретируется как целое число и выводится как шестнадцатитеричное число с представлением цифр A-F прописными буквами. |
Вы можете воспользоваться нумерацией аргументов, аналогично введенной в версии 4.0.6, а это означает, что не обязательно сохранять тот же порядок их следования, в каком они были заданы спецификациями преобразований. Например:
printf ("Общая сумма заказа: %2\$.2f. (с доставкой: %1\$.2f) ",
$total_shipping, $total );
Вполне достаточно внести позицию аргумента в список, следующий непосредственно за знаком %
, после чего следует символ $
— в рассматриваемом нами примере последовательность 2\$
означает "заменить вторым аргументом списка". Этот метод может использоваться также и для повторяющихся аргументов.
Две альтернативные версии этих функций называются vprintf ()
и vsprintf ()
. Данные вариации принимают два параметра: строку формата и массив аргументов, а не переменное количество параметров.
Изменение регистра строки
Можно также изменить регистр строки. Эта возможность не особенно полезна для разрабатываемого нами приложения, тем не менее, мы рассмотрим несколько кратких примеров.
Применительно к строке темы, $subject
, используемой для сообщения электронной почты, регистр можно изменить с помощью нескольких функций. Результаты их использования кратко описаны в таблице.
Функция | Описание | Использование | Результирующее значение |
---|---|---|---|
$subject | Feedback from web site | ||
strtoupper () | Преобразует символы строки в прописные буквы. | strtoupper ($subject) | FEEDBACK FROM WEB SITE |
strtolower () | Преобразует символы строки в строчные буквы. | strtolower ($subject) | feedback from web site |
ucfirst () | Делает первый символ строки прописным, если он был буквенным знаком. | ucfirst ($subject) | Feedback from web site |
ucwords () | Делает прописным первый символ каждого слова в строке, которая начинается с буквенного знака. | ucwords ($subject) | Feedback From Web Site |
Форматирование строк для хранения: функции addslashes () и stripslashes ()
Кроме использования строковых функций для визуального преобразования строки, некоторые из этих функций можно применять для преобразования строки с целью ее сохранения в базе данных. Хотя процесс записи в базу данных будет рассматриваться позднее, мы рассмотрим форматирование строк для последующего их хранения в базе данных.
Некоторые символы вполне могут быть частью строки, однако иногда они становятся источником проблем, в особенности при записи строки в базу данных, поскольку она может интерпретировать их как управляющие символы. Такими символами являются кавычки (одинарные и двойные), символы обратной косой черты (\
) и символ NULL
.
Нужно найти способ маркирования, или понять, что мы имеем в виду литеральное представление специального символа, а не его интерпретацию в качестве управляющей последовательности. Чтобы отменить эти символы, перед ними необходимо поместить символ косой черты. Например, "
(двойная кавычка) превращается в \"
, а \
(обратная косай черта) превращается в \\
(две обратных косых черты). Это правило применяется ко всем специальным символам, поэтому при наличии в строке символов \\
их следует заменить последовательностью \\\\
.
В РНР существуют две функции, которые специально предназначены для отмены символов. Прежде чем записывать какие-либо строки в базу данных, их следует переформатировать с помощью функции addslashes ()
, которая добывляет косые черты.
Например:
$feedback = addslashes ($feedback);
Подобно многим другим строковым функциям, addslashes ()
принимает строку в качестве параметра и возвращает переформатированную строку.
Можно протестировать эти функции на своем сервере. Для этого внесите изменения в файл process.php
:
Откройте страницу с HTML-формой, заполните ее и нажмите кнопку отправить сообщение.
В окне веб-браузера это будет выглядеть ТАК.
Фактические результаты использования этих функций применительно к строке отображены на рисунке.
Если вы видите такой результат, значит, РНР сконфигурирован на автоматическое добавление косых черт.
Данная возможность носит название магических кавычек и управляется директивой конфигурации magic_quotes_gpc. В новых версиях РНР эта директива по умолчанию включена. Буквы "gpc" в имени директивы означают GET, POST и cookie. Это значит, что все переменные, поступающие из упомянутых источников, автоматически помещаются в кавычки. Проверить, включена директива magic_quotes_gpc
, можно с помощью функции get_magic_quotes_gpc ()
, которая вернет значение true, если это так. В случае если режим магических кавычек включен, перед отображением к пользовательским данным необходимо применять функцию stripslashes ()
, иначе косые черты будут видны на экране.
Использование магических кавычек позволяет создавать более переносимый код.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться