#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. # Для этого используется модуль ssi-pl.pl if (($ENV{'QUERY_STRING'} eq '') or ($ENV{CONTENT_LENGTH}=0) ) { # Если нет входных данных, то генерируем страницу с формой print < <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <meta name="GENERATOR" content="Microsoft FrontPage 3.0"> <title>Книга жалоб и предложений</title> </head> <body background="../images/background_new.jpg"> <div align="left"> <table border="0" width="630" height="49"> <tr> <td width="200" height="45"></td> <td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td> </tr> </table> </div><div align="left"> <table border="0" width="630" height="53" cellspacing="0" cellpadding="0"> <tr> <td width="200" height="260" valign="top"> <p align="center"> HTML DoInclude("_menu.htm"); # Это SSI-включение навигационной панели. print <<HTML; </p> <p align="left"> </td> <td width="10" height="53" valign="top"></td> <td width="410" height="53" valign="top"><table border="1" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%"><form name="GuestBook" method="POST" action="add_guestbook.pl"> <div align="left"><p><small>Я, <input type="text" name="Name" size="20"></small>, <small>по профессии простой </small><input type="text" name="Work" size="20">, <small>посетив данный сервер и ознакомившись с представленными на нем материалами, хочу выразить свои чувства и эмоции следующими приличными словами:</small></p> </div><div align="left"><p><small> </small><input type="radio" value="Good" checked name="RadioButton"><small>мне понравилось :-)</small></p> </div><div align="left"><p><small> </small><input type="radio" name="RadioButton" value="Bad"><small>мне не понравилось :-( </small></p> </div><div align="left"><p> <input type="radio" name="RadioButton" value="Different"><small>мне пофигу :-| </small></p> </div><div align="left"><p><small>В дополнение к сказанному хочу так же сказать: </small></p> </div><div align="left"><p><textarea rows="4" name="Text" cols="30"></textarea></p> </div><div align="left"><p><small>Прошу принять к рассмотрению мое заявление и незамедлительно принять меры. Решение по моему заявлению направить письменно на мой электронный адрес </small><input type="text" name="Email" size="20"><small>.</small></p> </div><div align="center"><center><p><input src="../images/send.JPG" name="Send" alt="Послать" border="0" type="image" WIDTH="53" HEIGHT="21">    <a href="read_guestbook.pl"><img src="../images/read.jpg" alt="Почитать" border="0" WIDTH="63" HEIGHT="21"></a></p> </center></div> </form> </td> </tr> </table> </td> <td width="10" height="53" valign="top"></td> </tr> </table> </div> </body> </html> HTML die; } # Теперь получаем входные данные. &GetFormInput; $Name = $field{'Name'} ; $Work = $field{'Work'} ; $RadioButton = $field{'RadioButton'} ; $Text = $field{'Text'} ; $Email = $field{'Email'} ; $Send = $field{'Send'} ; # это поле не используется # Проверяем, заполнены ли обязательные поля. # Если нет - генерируем HTML страницу с просьбой заполнить нужные поля. if ($Name eq '' || $Email eq '' || $Text eq '') { print <<HTML; Content-type: text/html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <meta name="GENERATOR" content="Microsoft FrontPage 3.0"> <title>Книга жалоб и предложений - ошибка</title> </head> <body background="../images/background_new.jpg"> <div align="left"> <table border="0" width="630" height="49"> <tr> <td width="200" height="45"></td> <td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td> </tr> </table> </div><div align="left"> <table border="0" width="630" height="53" cellspacing="0" cellpadding="0"> <tr> <td width="200" height="260" valign="top"><p align="center"> HTML DoInclude("D:/InetPub/wwwroot/_menu.htm"); print <<HTML; </p> <p align="left"> </td> <td width="10" height="53" valign="top"></td> <td width="410" height="53" valign="top"><p align="left"><small>Вы не указали свое имя, E-mail, либо не заполнили сам текст Вашего отзыва. Вернитесь, пожалуйста, на страницу формы и заполните требуемые поля.</small></p> <p align="center"><a href="add_guestbook.pl">Назад</a> </td> </tr> </table> </div> <table> <tr> <td width="10" height="53" valign="top"></td> </tr> </table> </body> </html> HTML } else # все данные правильно введены { # Если все поля заполнены правильно, то начинаем их обрабатывать. $Text=~tr/\r\n/ /; #заменяем перевод строки на пробел # Если в текстовом поле формы (text box) посетитель нажимал Enter, # то нужно убрать символы перевода строки, чтобы можно было записать # все поля формы в одну строку файла. if ($Work eq '') {$Work=' '}; #если пусто - то пробел # Если поле не заполнено, то оно равно пробелу. $Name=~s/&/ /g; $Work=~s/&/ /g; $Text=~s/&/ /g; $Email=~s/&/ /g; # Если посетитель использовал символ &, то заменяем его на пробел, # поскольку этот символ мы будем использовать для разделения наших полей в файле. open(OutFile, ">>guestbook.txt") || die; # Открываем файл для добавления. $Time=localtime; #получаем время # Получаем время заполнения гостевой книги. $line=join('&', $Time, $Name, $Work, $RadioButton, $Text, $Email, $ENV{REMOTE_HOST}); # И, наконец, слепляем все поля формы в одну строку. На всякий случай добавляем в конце # IP адрес посетителя, взятый из переменных окружения. print OutFile "$line\n"; close OutFile; # Записываем полученную строку в файл и закрываем его. # Осталось только сказать посетителю спасибо. # выводим сообщение о успехе print "Content-type: text/html\n\n"; print "<html>\n" ; print "\n" ; print "<head>\n" ; print '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'."\n" ; print '<meta name="GENERATOR" content="Microsoft FrontPage 3.0">'."\n" ; print "<title>Книга жалоб и предложений</title>\n" ; print "</head>\n" ; print "\n" ; print '<body background="../images/background_new.jpg">'."\n" ; print '<div align="left">'."\n" ; print "\n" ; print '<table border="0" width="630" height="49">'."\n" ; print " <tr>\n" ; print ' <td width="200" height="45"></td>'."\n" ; print ' <td width="430" height="45"><p align="center">'; print '<img src="../images/guestbook.GIF" alt="Книга жалоб" WIDTH="258" HEIGHT="60"></td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print '</div><div align="left">'."\n" ; print "\n" ; print '<table border="0" width="630" height="53" cellspacing="0" cellpadding="0">'."\n" ; print " <tr>\n" ; print ' <td width="200" height="260" valign="top"><p align="center">'."\n" ; DoInclude("D:/InetPub/wwwroot/_menu.htm"); print ' <p align="left"> </td>'."\n" ; print ' <td width="10" height="53" valign="top"></td>'."\n" ; print ' <td width="410" height="53" valign="top"><p align="center"><small>Ваши данные'."\n" ; print " приняты. Спасибо.</small></p>\n" ; print ' <p align="center"><a href="read_guestbook.pl">'; print '<img src="../images/read.jpg" alt="Почитать" border="0" WIDTH="63" HEIGHT="21"></a> </td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print "</div>\n" ; print "\n" ; print "<table>\n" ; print " <tr>\n" ; print ' <td width="10" height="53" valign="top"></td>'."\n" ; print " </tr>\n" ; print "</table>\n" ; print "</body>\n" ; print "</html>\n" ; } # Не забываем подпрограмму разбора данных из формы. sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$buf,$ENV{'CONTENT_LENGTH'}); } else { $buf=$ENV{'QUERY_STRING'}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(..)/pack("c",hex($1))/ge; $name=~tr/+/ /; $name=~ s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; #if you want multi-selects to goto into an array change to: #$field{$name} .= "\0$val"; } } } return 1; }