Из-за опасности терактов Минатом усиливает охрану ядерных объектовДагестан: федеральные силы почти захватили село ЧабанмахиПименов скрылся в Праге

Gazeta.Ru

Prev   25.11. 0, вторник Московское время: 12:15:33 Выпуск No. 032   Next
 
[14.04.1999, 20:13:36]
Дмитрий Турецкий,
<dmitri@listsoft.com>
Форма - мылом...

Сегодня мы начнем разговор о CGI скриптах, точнее, об их написании. Некоторую базово-вводную информацию о том, что такое CGI зачем оно нужно можно найти в одной из предыдущих заметок. Писать мы будем на Perl-е (просьба не пугаться, если вы не знаете этот язык, я тоже не эксперт, так что разбираться будем вместе :) Для работы вам потребуются самые базовые знания о программировании, а именно - понимание того, что такое переменная, массив, файл, функция, подпрограмма, переменная окружения, алгоритм и т.п. Для того чтобы работать с Перлом под Windows, вам понадобится Perl for Win32, а для тестирования скриптов без использования сервера есть такая хорошая штука как Perl Builder.

Конечной целью планируемых мной нескольких заметок будет написание "джентельменского набора" скриптов - отправка заполненной формы со странички по E-mail, счетчик и поисковик. Дальше, если возникнет желание, вы сможете написать еще что-нибудь, используя выученные команды и методы как шаблоны.

Для начала вам надо связаться с провайдером и убедиться, что он разрешает использовать CGI. Если да, тогда узнайте у него где находится Perl (скорее всего, это будет /usr/local/bin/perl), а также где находится sendmail - программа, занимающаяся отправкой почты (скорее всего, это будет что-то вроде /usr/sbin/sendmail). Если же провайдер не разрешает использование скриптов, вам придется либо искать другого провайдера, либо обходиться без скриптов, либо использовать какой-нибудь бесплатный сервис.

Итак, мы хотим, чтобы посетитель нашей странички мог отправлять сообщения, заполняя форму на сайте. Начать имеет смысл с подготовки странички с формой. Я исхожу из того, что HTML вы знаете (или, как минимум, у вас есть справочник) и нижеследующий текст загадки представлять не будет:

<HTML>
<BODY>
<form method=POST action="formmail.cgi">
<input type=text name="username">
<input type=text name="useremail">
<input type=text name="usercomment">
<input type=submit value="Send"></form>
</BODY>
</HTML>

Здесь мы создали пустой HTML файл с тремя текстовыми полями для ввода имени пользователя, его почтового адреса и комментария, а также кнопку для отправки собщения. Команда action="formmail.cgi" задает имя скрипта, который мы будем писать. Здесь предполагается, что скрипт расположен в той же директории, что и сам файл. Если по каким-либо соображениям вы его перенесете, надо будет указать путь к файлу скрипта. Команда method=POST определяет способ передачи информации. Есть два метода: GET и POST. Никакой принципиальной разницы между ними нет, за исключением того, что в случае GET информация будет передаваться открыто в адресе, т.е. у вас получится что-то вроде http://www.vasya.pupkin.ru/formmail.cgi?username=..., а в случае POST передаваемая информация видна не будет. Со стороны же скрипта единственная разница заключается в том, откуда брать информацию: из строки запроса или со стандартного ввода.

Теперь начинается самое интересное: написание скрипта. Создайте пустой текстовый файл и напишите в первой строке:
#!/usr/local/bin/perl

Здесь надо указать расположение Perl-овского интерпретатора, которое вам сообщил провайдер. Эта команда нужна для указания системе, что данный скрипт написан именно на Perl-е, и должна присутствовать в каждом скрипте, который вы пишете.

Теперь нам надо определить некоторые переменные, которыми мы будем пользоваться (например, расположение почтовой программы и ваш адрес). Перл - язык умный и не требует от вас ни выделения памяти для переменных, ни определения их типа, ни каких-то других премудростей. Переменные в Перле начинаются со знака доллара, а тип их определяется исходя из контекста. Поэтому следующими сторочками мы пишем:

$mail_prog = '/usr/sbin/sendmail';
$receipient = "petya\@vasya.pupkin.ru";

Обратите внимание на точку с запятой в конце строк - так оканчиваются операторы. Также посмотрите на разницу в написании строк - в первом случае я использовал апострофы для определения строки, а во втором - кавычки. Разница между ними заключается в том, что строки внутри кавычек проверяются интерпретатором и, например, встреченные переменные заменяются на их значения. Массивы в Perl-е начинаются с символа @, именно поэтому в адресе стоит \@ - обратная косая указывает Perl-у, что имеется в виду не массив @vasya, а символ @. После обработки интерпретатором эта строка превратится в нормальный адрес. Учтите, что перл различает большие и маленькие буквы, поэтому набирайте переменные аккуратно.

Теперь пора переходить к действиям. Нам надо прочитать данные, отправленые формой, сохранить их в каких-то переменных, а затем создать и отправить письмо. Эти действия лучше вынести в отдельные подпрограммы, т.к. они являются достаточно стандартными и вы сможете использовать готовые блоки в разных скриптах. Имена подпрограмм в Perl-e начинаются с амперсанда (&). Поэтому, следующей строчкой мы пишем:

&GetFormInput;

Эту подпрограммку нам еще предстоит написать, а пока предположим, что она в качестве результата своей работы будет создавать массив @FORM в котором в качестве аргумента будет использоваться имя поля формы (в нашем примере - username, useremail, usercomment), а в качестве значения - содержимое соответствующего поля. Таким образом, например, $FORM{'username'} будет содержать значение, введенное пользователем в поле username. Соответственно, следующее, что мы напишем в скрипте будет:

$user = $FORM{'username'}; $email = $FORM{'useremail'}; $comment = $FORM{'usercomment'};

Осталось только указать подпрограмму, которая будет отправлять почту:
&transfer;

И теперь завершаем работу:
exit (0);

Теперь осталось оформить две нужные подпрограммы:

sub GetFormInput {
Эта строчка указывает, что дальше мы будем описывать подпрограмму GetFormInput. Все операторы, относящиеся к процедуре должны находиться между открывающей и закрывающей фигурными скобками.

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
Эта команда читает стандартный ввод (помните, что мы используем метод POST?) и помещает данные в переменную $buffer. А переменная окружения CONTENT_LENGTH указывает на размер данных.

@pairs = split(/&/, $buffer);
Здесь мы разбиваем полученную длинную строку с данными на подстроки, причем разделителем является символ & (этот символ отделяет каждую пару имя=значение). Полученные подстроки записываются в массив @pairs

foreach $pair (@pairs) {
Цикл, который обрабатывает каждую получившуюся подстроку (точнее, каждый элемент массивы @pairs).

($name, $value) = split(/=/, $pair);
Каждая подстрока разбивается на две величины: имя и значение, причем разделителем служит знак равенства. Получившиеся величины сохраняются в переменных $name и $value.

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Эти строчки конвертируют специальные коды (вида =07=0А), которые могут быть отправлены формой в обычные символы.

$FORM{$name} = $value;
Записываем в массив (точнее в хэш - массив, в котором индехы - текстовые) соответствующие значения.
}
}

Теперь вторая подпрограмма, отправляющая форму:
sub transfer {
open (MAIL, "|$mail_prog $receipient");
print MAIL "Subject: web mail\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-Type: text/plain; charset=\"koi8-r\"\n";
print MAIL "Content-Transfer-Encoding: 8bit\n";
print MAIL "\n\n";
print MAIL "Name: $user\n";
print MAIL "E-mail: $email\n";
print MAIL "Comment: $comment\n";
close (MAIL);
}

Здесь мы используем стандартную почтовую программу, установленную на сервере, и передаем ей команды, используя ее синтаксис. Часто встречающееся \n означает переход на новую строчку (нажатие кнопки Enter, если бы вы выполняли эти команды вручную). Вспомните, что строки внутри кавычек обрабатываются интерпретатором и вместо переменных вставляются их значения.

Вот и все! У вас есть готовый скрипт, который вы написали самостоятельно! Осталось только положить его на сервер (вместе с HTML файлом) и опробовать. Не забудьте только, что скрипт надо выкладывать на сервер с помощью FTP клиента, переключенного в ASCII режим. А после выгрузки - указать, что это исполняемый файл (в большинстве современных FTP клиентов есть специальная функция для этого, которая называется, скорее всего, chmod). Если вы не сумеете это сделать, то свяжитесь с провайдером и попросите его указать соответствующие права для вашего скрипта.

Разумеется, этот скрипт несколько "недоделанный". Например, он не выводит пользователю подтверждения, что его комментарий действительно отправлен. Но этим мы займемся как-нибудь в следующий раз.


. Лист SOFT: подпишись!
. download.ru: русский софт
. Freeware.ru: халява, сэр!
. FreewareHome - то же
. DaveCentral - каталог
. TuCows - выбери зеркало
. WinFiles - часть C|Net.
. NoNags - только даром
. Filez - поиск софта
. FTPSearch - пойск по FTP
... Русский FTPSearch
ПРОШЛЫЕ ВЫПУСКИ
АВГУСТ 1999
Пн Вт Ср Чт Пт Сб Вс
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

НОВОСТИ OFFLINE
Наши новости - на пейджер Мобил Телеком!
Наши новости - на ваш пейджер!
НОВОСТЬ ДНЯ
В Москве взорвался жилой дом
В Москве взорвался жилой дом
КОММЕНТАРИИ
Пропавшие дети - 2
Пропавшие дети - 2
ПОМОГИТЕ ДЕТЯМ!
П о м о г и т е  д е т я м !
WWW.SOS.RU
Ляпкин Антон Ляпкин Антон
Отсутствие желчного пузыря
Роман Чеснов (3435) 23-64-94
ПОЛИТИКА В РЖ
Война. Отставка. Все про август!
Война. Отставка. Все про август!
MSNBC.RU
GAZETA.RU - ПАРТНЕРЫ MSNBC.RU
ПРАЗДНИК
праздник



ПОИСК ПО РАЗДЕЛАМ:

GAZETA.RU

.   Ну и денек

.   Бесэдер?

.   Немузыка

.   Macht Frei

.   Time o'clock

.   Текущий выпуск

.   От редакции

.   Алгоритм

.   Досье

.   Дисковод

.   Публикация

.   Служебный раздел

.   Здоровье

.   Интернет

.   Интервью

.   Книги

.   Комментарии

.   Культура

.   Курицын Daily

.   Лесные дали

.   Мнения

.   Наедине со всеми

.   Общество

.   Пресса

.   Пушкинский проект

.   Спорт



Lenta.Ru Rambler

RB2 Network

RB2 Network

Prev   25.11. 0, вторник Московское время: 12:15:33 Выпуск No. 032   Next

Пишите нам: info@gazeta.ru
Copyright © Gazeta.Ru
RRU_Network