Замечания по коду ( только не обижайся, это не для того, что бы тебя обидеть ):
1. Всегда используй прагму strict, я больше чем уверен, что там половина переменных вообще не нужны.
2. Пользуйся стандартным модулем CGI.pm, например для декодирования полей.
3. Почему нет проверки полей, например: регулярными выражениями?
4. Где ключь -T? Конечно он не обязателен, но желательно использовать его в каждой CGI программе. Что это за зверь, читай здесь: http://forum.vingrad.ru/index.php?showtopic=44245
5. Не имей привычки читать файл в массив, рано или поздно ты убъёшь оперативную память.
Остальные замечания смотри в коментариях, их очень много.
Вот тебе твой же код, только немного в другом формате и с встроенной, простейшей разбивкой по страницам( всё прокоментировано ). Согласись, его теперь намного проще понять. 
| Код | #!/usr/bin/perl -w use CGI::Carp qw(fatalsToBrowser);
# Выводим заголовок, ВНИМАНИЕ МЕТА-ТЕГИ Я ПЕРЕНЁС В КОНФИГ, # ТАК КАК ОНИ ДОЛЖНЫ БЫТЬ В ГОЛОВЕ ДОКУМЕНТА, ЛЮБОЙ HTML # ДОКУМЕНТ ДОЛЖЕН НАЧИНАТЬСЯ С ТЕГА <html>, а не с <meta> print "Content-type:text/html\n\n";
# Получаем и декодируем параметры if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$fd,$ENV{'CONTENT_LENGTH'}); } else { $fd = $ENV{'QUERY_STRING'}; }
$fd =~ s/%(..)/pack("C",hex($1))/eg; $fd =~ tr/+/ /; @pair = split(/&/,$fd);
foreach $pairs (@pair) { ($name,$value) = split(/=/,$pairs); $form_data{$name} = $value; }
# Узнаём IP клиента, немного подправил $ip = $ENV{ HTTP_X_FORWARDED_FOR } || $ENV{ REMOTE_ADDR };
# Подгружаем конфигурационный файл require "htm.cfg";
################################################# # Несколько переменных для разбивки на страницы # ################################################# my $start_mess = $form_data{'ms'} || 1; $start_mess = 1 unless $start_mess =~ /^[0-9]+$/; my $stop_mess = $start_mess + $mstopage;
# Если были получены параметры if( $form_data{'el'} ) { # Получаем текущую дату и время ($s,$m,$h,$mday,$mon,$year) = localtime(time); $year = $year+1900; $h = "0"."$h" if $h < 10; $mon = "0"."$mon" if ($mon < 10);
# Обрабатываем параметры $form_data{'el'} =~ s/</</g; $form_data{'el'} =~ s/>/>/g; $form_data{'el'} =~ s/ / /g; $form_data{'el'} =~ s/\n/<br>/g;
# Если имя не указано, то устанавливаем значение по умолчанию $form_data{'name'} = "Аноним" if( $form_data{'name'} eq "" );
# Формируем строку для записи в файл $stephan = "$form_data{'el'}:$ip:$form_data{'email'}:$form_data{'name'}:$h:$m:$mon:$year:$mday\n";
# Открываем файл для записи или умираем с музыкой open(DB,">>$base_url") or die "Can't open base file: $!\n"; print DB "$stephan"; close(DB);
# Подгружаем конфигурационный файл, правда не понятно, зачем? # Ведь мы его уже подгузили ранее. Пока закоментировал, а там # видно будет. # require "htm.cfg";
print $style_spec; print qq( <font class='fontss'> Через 3 секунды вас перебросит <a href='$url_long'>обратно</a> </font> ); print $style_off; exit 0; # Успешно завершаем выполнение программы }
print "$style_on"; print "$middle";
# Открываем файл для чтения и вывода сообщений, НО ТОЛЬКО ТОГДА, КОГДА # ОН СУЩЕСТВУЕТ, ИНАЧЕ ПОЛУЧИМ ОШИБКУ. if ( -e $base_url ) { open(BASE,"<$base_url") or die "Can't open dase file: $!\n"; # Открываем или умираем @q = <BASE>; close(BASE); }
$recs=0;
# Циклически выводим все сообщения. Добавил reverse, так как это более логично, # если более новые сообщения будут вверху.
################################################# # Некоторые переменные для разбивки на страницы # ################################################# my @pages = (); my $pag_count = 0; my $cnt_pg = 1; my $count = 0; my $mess_count = 0;
foreach $qw (reverse @q){ ##################################################### # Разбиваем на страницы # ##################################################### ++$mess_count; ++$count;
if ( $count == $start_mess ) { $pag_count++; push( @pages, "<b>$pag_count</b>" ); $cnt_pg += $mstopage; $mess_count = 0; } elsif ( $mess_count == $mstopage ) { $pag_count++; push(@pages, "<a href='$ENV{SCRIPT_NAME}?ms=$cnt_pg'>$pag_count</a>"); $cnt_pg += $mstopage; $mess_count = 0; }
next if ( ( $count < $start_mess ) || ( $count >= $stop_mess ) );
my($message,$ip_adr,$email,$name,$h,$m,$mon,$year,$mday) = split(/\:/,$qw); if( $email eq '' ) { print qq( <table width='100%' border='1'> <tr><td bgcolor = $sh_top class = tabl> :: $name || $h\:$m \| $mday\/ $mon \/ $year :: </tr></td> <tr><td bgcolor = $sh_down class=tabl> <font>$message</font> </td></tr> </table><br> ); # Здесь были добавлены теги </td></tr> }else{ print qq( <table width = 100%> <tr><td bgcolor = $sh_top class = tabl>:: <a href = 'mailto:$email'>$name</a> || $h\:$m \| $mon \/ $year :: </tr></td> <tr><td bgcolor = $sh_down class = tabl> <font>$message</font> </td></tr></table><br> ); # Здесь были добавлены теги </td></tr>
} }
##################################### # Выводим ссылки, на страницы # ##################################### print join(" | ", @pages);
# Нижняя часть страницы print "$style_off";
|
Конфигурационный файл, в нём тоже было много ошибок. Так же читай кометрарии.
| Код | #####################################Настройки######################################## $bg_color = "CCCCFF"; # цвет фона страницы $fon_color = "BBBBEE"; # цвет текстовых строк и поля сообщения $titul = "Моя гостевая книшшка!"; # заголовок страницы $strelka = "#000000"; # Цвет стрелок скроллбара $scroll = "#848AA5"; # Цвет скроллбара $shrift = "#000000"; # Цвет шрифта $fonts = "Times New Roman"; # Стиль шрифта $font_size = "20px"; # Размер шрифта в пикселях $border_color = "#000000"; # Цвет бордеров $sh_top = "#AAAADD"; # Цвет верхней части таблицы $sh_down = "#BBBBEE"; # Цвет нижней части таблицы $url = $ENV{SCRIPT_NAME}; # Относительный путь к гостевой $base_url = "base.txt"; # Нахождение файла с сообщениями $url_long = "http://localhost/cgi-bin/guest.pl"; #Полный путь к гостевой $mstopage = 5; # Кол-во сообщений на страницу
################################################################################ # Выводим начало страницы и стили CSS (здесь нужно определиться в # # каком регистре ты пишешь HTML тэги и стили, а то получается каша. Подправил. # ################################################################################ $style_on = qq~ <html> <head> <!--// Стили пишем в заголовок //--> <style type="text/css">
.cld { background-color: $fon_color; font-family: $fonts; font-size: $font_size; border-right: $border_color 1px solid; border-left: $border_color 1px solid; border-top: $border_color 1px solid; border-bottom: $border_color 1px solid; color: $shrift };
.main { scrollbar-arrow-color: $strelka; scrollbar-base-color: $scroll; topmargin: 0 };
.fontss { font-family: $fonts; font-size: $font_size; color: $shrift }
.tabl{ border-right: $border_color 1px solid; border-left: $border_color 1px solid; border-top: $border_color 1px solid; border-bottom: $border_color 1px solid; font-family: $fonts; font-size: $font_size; color: $shrift } </style> <title>$titul</title> <meta http-equiv='pragma' content='no-cache'> <meta http-equiv='cache-control' content='no-cache'> <meta http-equiv='Content-Type' content='text/html\; charset=windows-1251'> </head> <body bgcolor = '$bg_color' class='main'> ~;
########################## # Нижняя часть страницы # ########################## $style_off = qq~ <hr><a href = 'mailto:rezzonans\@yandex.ru' class='fontss'>© Elf's Web Studio</a> </body> </html> ~;
################################################################################ # Форма. Вот здесь action абсолютно не нужет, если он не указан, параметры # # получает тот же скрит, что и отправляет их, как раз то, что нам нужно. # ################################################################################ $middle = qq~ <form method='POST'> <table class='fontss' border='0'> <tr> <!--// В следующей строке было 2 открывающих тега <td>, подправил //--> <td>Имя</td> <!--// Вследующей строке сначала закрывается тег </td> //--> <td><input type='text' name='name' size='20' class='cld'></td> </tr> <!--// Объясни, для чего нужны следующие теги? Если не знаешь, удали </td></td></td> //--> <tr> <!--// В следующей строке было 2 открывающих тега <td>, подправил //--> <td>E-mail</td> <!--// Вследующей строке сначала закрывается тег </td> //--> <td><input type='text' name='email' size='20' class='cld'></td> </tr> <!--// Объясни, для чего нужны следующие теги? Если не знаешь, удали </td></td></td> //--> </table> <!--// Почему textarea расположен вне таблицы? //--> <textarea COLS='70' ROWS='10' name='el' class='cld'></textarea><br> <input type='submit' value='Отправить' class='cld'> </form> <br><br> ~;
################################################################################ # Верхняя часть страницы со стилями, которые предназначены для формирования # # страницы, после успешного добавления сообщения в гостевую книгу. # ################################################################################ $style_spec = qq~ <html> <!--// Опять же определись с регистром тегов и стилей, а так же пиши стили CSS и сценарии JavaScript в голову документа, для большего понимания, представь себе, что это мозг документа, он должен быть в голове. Это обеспечит загрузку стилей и сценариев в раньше самого документа. //--> <head> <style type='text/css'> .main { scrollbar-arrow-color: $strelka; scrollbar-base-color: $scroll; topmargin: 0; }
.fontss { font-family: $fonts; font-size: $font_size; color: $shrift; }
.tabl { border-right: $border_color 1px solid; border-left: $border_color 1px solid; border-top: $border_color 1px solid; border-bottom: $border_color 1px solid; font-family: $fonts; font-size: $font_size; color: $shrift; } </style> <title>$titul</title> <meta http-equiv='pragma' content='no-cache'> <meta http-equiv='cache-control' content='no-cache'> <meta http-equiv='Content-Type' content='text/html\; charset=windows-1251'> <!--// Cценарии JavaScript так же пишем в голову документа //--> <script language="JavaScript" defer type="text/javascript"> <!--// function timer() { setTimeout("parent.location.href='$url'", 3000); } //--> </script> </head> <body bgcolor='$bg_color' onLoad='timer()' class='main'> ~;
|
Только твой код очень опасен, просто находка для санитаров леса. ;)))) Ладно разберайся. Если будет что-то не понятно, пиши. |