Очень часто на web-странице необходимо отправить письмо, сохранить переменную для следующего визита пользователя. В этом уроке мы научимся решать эти, а также некоторые другие задачи, используя язык PHP.

4.1. Отправка электронных писем

язык HTML дает возможность создавать ссылки на электронный адрес, например:

<p>Авторский проект <a href="mailto:This email address is being protected from spambots. You need JavaScript enabled to view it.">Титорова Даниила</a>

При щелчке на такой ссылке на компьютере посетителя запустится почтовый клиент, например OutlookExpress в котором можно будет набрать письмо. Такой способ имеет ряд недостатков:

  1. На компьютере посетителя почтовый клиент может быть не настроен (посетитель смотрит ваш сайт не с домашнего компьютера, а в интернет-кафе или в офисе).
  2. Переход из одной программы в другую вызывает у части пользователей сложности, а разве мы хотим усложнять и без того непростую жизнь наших гостей?
  3. Использование адреса в html-коде делает его доступным для спамеров, так что не удивляйтесь если в вашем почтовом ящике начнут появляться нежелательные письма с рекламой чего-угодно.

PHP предлагает простое средство, которое убирает эти недостатки:

Листинг №15

форма для набора письма

<form method="post" action="mail.php"> 
  <p>от кого:  <input name="author" type="text" size="30"></p>  
  <p>текст письма:  <textarea name="text" cols="50" rows="5"></textarea></p> 
  <p><input type="submit" name="mail" value="отправить"></p> 
</form>  

PHP-код для отправки сообщения

<?php
if(isset($mail)){
  $subject = 'письмо с сайта от '.$author;
  mail('...', $subject, $text);
}
?>

В первой части кода создается форма с полями "author" и "text". После нажатия кнопки "submit", данные передаются методом POST по адресу mail.php.

Во второй части, исполняемой на сервере, в случае если кнопка "submit" нажата, вызывается функция mail(), которая имеет три параметра: электронный адрес, куда нужно доставить письмо, тему письма, и собственно текст письма. В приведенном примере тема письма получается соединением строки "письмо с сайта от" и принятой переменной author. Так как весь код выполняется на стороне сервера, пользователь не сможет увидеть его в своей сгенерированной странице.

Конечно, почтовые клиенты дают гораздо больше возможностей, чем простой набор текста, но для многих случаев предложенное решение вполне приемлемо.

4.2. Загрузка графических файлов

Если вам нужно, чтобы пользователь загрузил на сервер каой-нибудь файл, например изображение, вам поможет следующий PHP-код:

Листинг №16

форма для выбора файла

<form action="#" method="POST" enctype="multipart/form-data">  
  Рисунок: <input type="hidden" name="MAX_FILE_SIZE" value="40000">       
  <input type="file" name="userfile" size="40">       
  <input name="add_qwest" type="submit" value="Добавить">  
</form>

PHP-код для обработки полученного файла

<?php
if (isset($_FILES["userfile"])) {     
  if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {  
    $filename = $_FILES['userfile']['tmp_name'];  
    // Определение каталога загрузки и имени файла  
    $uploaddir = 'img/';  
    $fn = $_FILES['userfile']['name'];  
    $uploadfile = $uploaddir.$fn; 
    // Загрузка   
    @move_uploaded_file($filename, $uploadfile); 
    print("<p>Файл загружен</p>"); 
  } else { 
    print("<p>Ошибка загрузки файла</p>");  
  } 
} 
?> 

В первой части кода строится форма с полем типа file, которое служит для выбора файла на диске пользователя. Обратите внимание на обязательное скрытое поле (type="hidden") которое носит имя MAX_FILE_SIZE (именно так, заглавными буквами). Это поле определяет максимальный размер загружаемого файла. В примере - это 4000 байт.

Во второй, исполняемой части в случае, если кнопка submit нажата, выполняется загрузка. Данный фрагмент будет загружать все файлы под исходным именем. Что конечно создаст проблемы, если попытаться загрузить на сервер файл, содержащий русские буквы. Также приведенный скрипт позволяет загружать файлы любого типа, что, конечно не безопасно. Для более профессиональной работы скрипт должен быть сложнее.

4.3. Динамические шаблоны

При создании сайта используя только средства HTML вы наверняка столкнулись с ситуацией, когда одни и теже куски кода вы вынуждены вставлять в каждую html-страницу. Для того чтобы рещить эту проблему в PHP, используется функция include(). Ее синтаксис очень прост:

include ("file.inc");

Она вставляет внутрь вашего php-файла кусок кода из файла file.inc. Разумеется, имя файла может быть произвольным, произвольным может быть и его расшщирение, но принято все же делать .inc для более быстрой сортировки, поиска. Теперь мы можем создать единый шаблон для нашей страницы, например такой (листинг 17):

Листинг №17

<html>
<head>
<title>шаблон сайта</title>
</head> <body> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr>
<td width="200"><? include("logo.inc"); ?></td> <td><? include("top.inc"); ?></td> </tr>
<tr>
<td width="200"><? include("menu.inc"); ?></td> <td> <?php
if (isset($_GET['id'])){ $id = $_GET['id']; if ($id==1){ include("about.inc"); } if ($id==2){ include("product.inc"); } if ($id==3){ include("contact.inc"); } } else { include("contact.inc");
} ?> </td> </tr> <tr> <td width="200"> </td> <td><?php include("bottom.inc"); ?></td> </tr> </table> </body> </html>

Обратите внимание, что внутри ячеек таблицы нет текста, графики, там находится внедренные фрагменты кода (рисунок 8).

Динамический шаблон
Рис. 8. Динамический шаблон.

Наиболее интересна контентная область. В зависимости от передаваемой переменной id в нее будет загружаться один из трех файлов: about.inc, product.inc или contact.inc. Каждый фрагмент может иметь произвольное текстовое и графическое наполнение.

Так как при первоначальном входе никакой переменной не передается, используется конструкция isset(), в таком случае загружается фрагмент about.inc. Сохраним файл на диске в виртуальном каталоге под именем index.php. Рассмотрим, содержимое файла menu.inc:

Листинг №18

<p>
   <a href="/index.php/edu/it-tecnology?id=1">о компании</a><br>      
   <a href="/index.php/edu/it-tecnology?id=2">продукты и услуги</a><br>      
   <a href="/index.php/edu/it-tecnology?id=3">контакты</a>
</p>  

Все три ссылки ведут на один и тот же файл index.php, но в каждом случае передается различное значение переменной id.

Такой способ построения сайта позволяет использовать общий шаблон. При добавлении информации мы просто добавляем одну строчку в файл menu.inc и еще одну проверку в контентной области шаблона.

Практические задания:

  1. Создайте простой сайт на основе динамического шаблона, описанного выше.
  2. Добавьте к нему еще один пункт меню «написать письмо». Создайте форму для отправки писем и программный код на языке PHP.

Вопросы для самоконтроля

  1. Почему нежелательно использовать на сайте html-тег <a href=”mailto:...”>?
  2. Какой способ передачи данных нужно использовать при загрузке изображений на сервер?
  3. Чем удобно использование динамических шаблонов?