На этот раз мы создадим простую и часто используюмую форму отзывов клиентов (форму обратной связи), позволяющую клиентам компании АВС вводить свои замечания и пожелания. Наше приложение будет обладать одним преимуществом по сравнению сдругими формами, которые можно встретить. Вместо того чтобы отправлять форму по обобщенному адресу электронной почты типа [email protected], мы постараемся сделать этот процесс более интеллектуальным за сче поиска во вводимых данных ключевых слов и выражений и последующей отправки сообщения электронной почтой соответствующему сотруднику компании. Например, если сообщение электронной почты содержит слово "advetising" (реклама), данные обратной связи будут направлены в отдел маркетинга. Если сообщение электронной почты поступает от самого крупного клиента, оно должно быть направлено руковолителю компании.
Форма обратной связи с клиентами postoffice.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Компания АВС</title>
<link href="../../svd.css" rel="stylesheet" type="text/css">
</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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Компания АВС</title>
</head>
<body>
<h2>О вашем сообщении</h2>
<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-формой ), приходится очищать от служебных символов, прежде чем их можно будет использовать по прямому назначению. Далее описаны функции, которые служат для этих целей.
Первый шаг в этом направлении предусматривает удаление лишних пробелов. Хотя этот шаг и не обязателен, он может оказаться полезным, если предполагается хранение строки в файле или базе данных либо ее сравнение с другими строками.
Для упомянутой цели в РНР предусмотрены три полезные функции. Функция trim () служит для приведения приводимых данных в порядок:
$name = trim ($name);
$email = trim ($email);
$feedback = trim ($feedback);
Функция trim () удаляет пробелы в начале и в конце строки и возвращает результирующую строку. При этом символами, которые она удаляет, по умолчанию считаются символы строки (\n), возврата каретки (\t) и вертикальной табуляции (\x0B), конца строки (\0) и обычные пробелы. Мы можем также указать второй параметр, который содержит список символов, подлежащихь удалению из строки, вместо списка по умолчанию. В зависимости от конкретно преследуемой цели вместо этой функции можно использовать ltrim () или rtrim (). Обе они аналогичны функции trim () в том, что принимают редактируемую строку в качестве параметра и возвращают отформатированную строку. Различие между ними состоит в том, что функция trim () удаляет пробелы в начале и конце строки, ltrim() удаляет пробелы только в начале строки (слева), а rtrim () — только в конце строки (справа).
В РНР имеется набор функций, которые можно использовать для переформатирования строк различными способами.
Функция nl2br () принимает строку в качестве параметра и заменяет в ней все символы новой строки XHTML-дескриптором <br/> (или HTML-дескриптором <br> в версиях РНР, предшествующих 4.0.5)ю Данная возможность полезна при выводе длинной строки в окне браузера. Например, мы воспользовались этой функцией для форматирования данных обратной связи с клиентами при выводе их на экран.
Скорректируем код сценария process.php и добавим следующие строки:
//без использования функции nl2br ()
<h3>До вызова функции nl2br ()</h3>
<p>Ваше сообщение отправлено</p>
<p><?php echo $mailcontent;?></p>
// после вызова функции
<h3>После вызова функции nl2br ()</h3>
<p>Ваше сообщение отправлено</p>
<p><?php echo nl2br ($mailcontent );?></p>
Откроем страницу с формой, заполним ее и нажмем кнопку Отправить сообщение.
В окне веб-браузера это будет выглядеть ТАК.
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 |
Кроме использования строковых функций для визуального преобразования строки, некоторые из этих функций можно применять для преобразования строки с целью ее сохранения в базе данных. Хотя процесс записи в базу данных будет рассматриваться позднее, мы рассмотрим форматирование строк для последующего их хранения в базе данных.
Некоторые символы вполне могут быть частью строки, однако иногда они становятся источником проблем, в особенности при записи строки в базу данных, поскольку она может интерпретировать их как управляющие символы. Такими символами являются кавычки (одинарные и двойные), символы обратной косой черты (\) и символ NULL.
Нужно найти способ маркирования, или понять, что мы имеем в виду литеральное представление специального символа, а не его интерпретацию в качестве управляющей последовательности. Чтобы отменить эти символы, перед ними необходимо поместить символ косой черты. Например, " (двойная кавычка) превращается в \", а \ (обратная косай черта) превращается в \\ (две обратных косых черты). Это правило применяется ко всем специальным символам, поэтому при наличии в строке символов \\ их следует заменить последовательностью \\\\.
В РНР существуют две функции, которые специально предназначены для отмены символов. Прежде чем записывать какие-либо строки в базу данных, их следует переформатировать с помощью функции addslashes (), которая добывляет косые черты.
Например:
$feedback = addslashes ($feedback);
Подобно многим другим строковым функциям, addslashes () принимает строку в качестве параметра и возвращает переформатированную строку.
Можно протестировать эти функции на своем сервере. Для этого внесите изменения в файл process.php:
<h2>О вашем сообщении</h2>
<h3>До вызова функции addslashes()</h3>
<p><?php echo nl2br ($feedback);?></p>
<h3>После вызова функции addslashes ()</h3>
<?php $feedback = addslashes ($feedback);?>
<p><?php echo nl2br ($feedback);?></p>
<h3>После вызова функции stripslashes()</h3>
<p><?php echo stripslashes($feedback);?></p>
Откройте страницу с HTML-формой, заполните ее и нажмите кнопку отправить сообщение.
В окне веб-браузера это будет выглядеть ТАК.
Фактические результаты использования этих функций применительно к строке отображены на рисунке.
Если вы видите такой результат, значит, РНР сконфигурирован на автоматическое добавление косых черт.
Данная возможность носит название магических кавычек и управляется директивой конфигурации magic_quotes_gpc. В новых версиях РНР эта директива по умолчанию включена. Буквы "gpc" в имени директивы означают GET, POST и cookie. Это значит, что все переменные, поступающие из упомянутых источников, автоматически помещаются в кавычки. Проверить, включена директива magic_quotes_gpc, можно с помощью функции get_magic_quotes_gpc (), которая вернет значение true, если это так. В случае если режим магических кавычек включен, перед отображением к пользовательским данным необходимо применять функцию stripslashes (), иначе косые черты будут видны на экране.
Использование магических кавычек позволяет создавать более переносимый код.
Похожие материалы по теме: