Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.5.2006
Репутация: нет Всего: нет
|
Я не програмист и мне нужна Ваша помощь в небольшом усовершенствовании скрипта. Итак есть скрипт добавления комментариев пользователями /cgi-bin/comment/comments.pl он создаёт в паке /cgi-bin/comment/data/ текстовые файлы "name_1.txt", "name_2.txt" и т.д. с комментариями для разных .htm страниц соответственно. В текстовых файлах одна строчка - один комментарий. Формат записи таков: NAME(Имя)NAMEDATE(Дата)DATE@Текст На страницу выводит помимо имени, даты/времени и текста комментария ещё и порядковый номер комментария. Вот этот порядковый номер и стал камнем преткновения. Как вывести кол-во комментариев на соответствующую страницу, которая ссылается на принадлежащие ей комментарии? Вывод данных приблизительно такой: [ комментариев 5 ] Способ вывода SSI. Помогите решить эту задачу. Код | #!/usr/bin/perl
#CommentsFSS v 1.2 # #Copyright (c) 2004 Paul, 7'th method
#use locale; $setfile="set.dat"; &loadset;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $bufer, $ENV{'CONTENT_LENGTH'}); } else { $bufer=$ENV{'QUERY_STRING'}; } @pairs = split(/&/, $bufer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%0D%0A/\n/g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } print "Content-type: text/html\n\n";
$id = $FORM{id}; if ($id =~ /\W/) { #Если в параметре найдены негодный символы, то завершение работы. #Читайте справку. exit; } $id =~ s/<([^>]|\n)*>//g; $action=$FORM{action}; if (length($id) == 0) { exit; } if ($action eq "add") { &add; } else { &view; }
sub view { #Проверка существования указанного файла if (-e "$data$id.txt") { #Файл существует, все в порядке. } else { #Файла нет, надо создать. open FILE,">$data$id.txt"; print FILE ""; close FILE; chmod(0755,"$data$id.txt"); } #Открывается файл с html, и %comm% в нем заменяется на комментарии, а %filename% #на имя вызываемого файла данных. Получившийся код вставляется на страницу. open(HTML,"$htmlfile"); &comm; while ($html = <HTML>) { $html =~ s/\%comm\%/$commh/g; $html =~ s/\%filename\%/$id/g; print "$html"; } close(HTML); }
sub comm { #Получение комментаиев из указанного файла данных. тут же создается дизайн. open (htmlcommfile, "<$htmlcommfile") || return; #Открытие файла с дизайном ОДНОГО комментария, и запись его в переменную. while (<htmlcommfile>) { $htmlcf = "$htmlcf$_"; } close htmlcommfile; $htmlcf =~ s/\n//g; $num = "0"; open(commfile,"$data$id.txt"); while (<commfile>) { $htmlcfc = $htmlcf; $num = $num+1; $_ =~ s/\n/<br><br>/g; #Перенос строки в файле данных заменяется на два переноса <br><br> $name="$_"; $name =~ s/\)NAME.*//g; $name =~ s/NAME\(//g; $name =~ s/\n//g; $date="$_"; $date =~ s/.*DATE\(//g; $date =~ s/\)DATE\@.*//g; $date =~ s/DATE\(//g; $text="$_"; $text =~ s/^NAME\(.*\)NAME//g; $text =~ s/DATE\(.*\)DATE\@//g; $htmlcfc =~ s/\%num\%/$num/g; $htmlcfc =~ s/\%name\%/$name/g; $htmlcfc =~ s/\%date\%/$date/g; $htmlcfc =~ s/\%text\%/$text/g;
#А это очень интересная строчка. Если вы хотите, чтобы комментарии показывались # по порядку (сначала первый, потом второй, и т.д.), то в следующей строчке #измените $htmlcfc$commh на $commh$htmlcfc. $commh="$htmlcfc$commh"; } close(commfile);
}
sub add { $id = ""; $name = ""; $date = ""; $text = ""; $errm=""; $id = $FORM{id}; $name = $FORM{name}; $text = $FORM{text};
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); $year-=100; if ($mon<10) {$mon="0$mon"} if ($mday<10) {$mday="0$mday"} if ($min<10) {$min="0$min"} if ($hour<10) {$hour="0$hour"} if ($sec<10) {$sec="0$sec"} if ($year<10) {$year="0$year"} #Это формат даты. $mday-число, $mon-месяц, $year-год, $hour-час, $min-минута, #$sec-секунда. Можно разделять символами. $date="$mday/$mon/$year $hour:$min";
if (not length($adminkey) == 0){ if ($name =~ /$adminkey/){ ($key,$aname) = split(/=/,$name,2); if ($key eq $adminkey){ $name2=$aname; $name2 =~ s/\s//g; if (length($name2) == 0) { $errm="Вы не заполнили поле Имя"; &msg; exit; } if (not length($adminname) == 0){ $adminname =~ s/\%adminname\%/$aname/g;} else{ $adminname = $aname;} $name=$adminname; goto ADMIN; } } }
$name2=$name; $name2 =~ s/\s//g; if (length($name2) == 0) { $errm="Вы не заполнили поле Имя"; &msg; exit; }
$text2=$text; $text2 =~ s/\s//g; if (length($text2) == 0) { $errm="Вы не заполнили поле Комментарий"; &msg; exit; }
if (length($name) > 50){ $errm="В поле Имя не должно быть больше 50 символов."; &msg; exit; }
elsif (length($text) >= 500){ $errm="В поле Комментарий не должно быть больше 500 символов."; &msg; exit; }
if ($disable_html == 1) { if ($text =~ /<([^>]|\n)*>/) { $text =~ s/<([^>]|\n)*>//g; $errm="В вашем комментарии были найдены html коды. Они удалены, а остальное добавлено."; } if ($name =~ /<([^>]|\n)*>/) { $name =~ s/<([^>]|\n)*>//g; $errm="В вашем комментарии были найдены html коды. Они удалены, а остальное добавлено."; } }
#Начало автозамены open(AUREP,"$autorepfile"); while (<AUREP>) { chomp($_); ($per1,$per2) = split(/=/,$_,2);
# $per1 =~ s/\)/\\)/g; # $per1 =~ s/\(/\\(/g;
if (not length($per1) == 0){ $text =~ s/\Q$per1/$per2/gi; } } close(AUREP); #Конец автозамены
$text =~ s/(\n){2,}/<br>/g;
$text =~ s/^\(//g; $text =~ s/\)$//g; ADMIN: $text =~ s/\n/<br>/g; $text =~ s/NAME\(//g; $text =~ s/\)NAME//g; $text =~ s/DATE\(//g; $text =~ s/\)DATE\@//g;
open FILE,">>$data$id.txt"; print FILE "NAME($name)NAMEDATE($date)DATE\@$text\n"; close FILE;
if ($savecomm="1") { #Запись в админ-файл open FILE,">>$adminfile"; print FILE "<b>$date\n"; print FILE "<b>Новое сообщение в файл данных $id.txt:\n"; print FILE "Страница сайта: $ENV{'HTTP_REFERER'}\n</b>"; print FILE "$name <b>писал:</b>\n"; print FILE "$text\n"; print FILE "<a href=\"$adminurl?id=$id\">Ссылка для редактирования</a>\n"; if (length($errm) == 0) { print FILE "<b>Комментарий добавлен без ошибок.</b>\n\n\n"; } else { print FILE "<b>Комментарий добавлен с ошибкой: $errm</b>\n\n\n"; } close FILE; }
if ($sendcomm = 1 and not length($sendmail) == 0 and not length($adminmail) == 0) { #Отправка письма администратору open (MAIL, "|$sendmail -t"); print MAIL "Subject: Новый комментарий от $name\n"; print MAIL "To: \"Администратор\" \<$adminmail\>\n"; print MAIL "From: \"$name\" \<$adminmail\>\n"; print MAIL "X-mailer: CommentsFSS 1.2\n"; print MAIL "X-originalip: $ENV{REMOTE_ADDR}\n\n"; print MAIL "Новое сообщение в файл данных $id.txt:\n"; print MAIL "Страница сайта: $ENV{'HTTP_REFERER'}\n"; print MAIL "$name писал:\n"; print MAIL "$text\n"; if (length($errm) == 0) { print MAIL "Комментарий добавлен без ошибок.\n"; } else { print MAIL "Комментарий добавлен с ошибкой: $errm\n"; } print MAIL "Ссылка для редактирования: $adminurl?id=$id\n"; print MAIL " CommentsFSS v 1.2 © 2004, 7'th method, Paul, http://paul.webhost.ru\n"; print MAIL "\n\n"; close (MAIL); } &msg; }
sub msg { #Вывод сообщения пользователю. $gburl = $ENV{'HTTP_REFERER'};# Определение, с какой страницы он пришел. if (length($gburl) == 0) { $gburl="javascript:history.back(1)"; } if (length($errm) > 0) { #Возникла какая-то ошибка, и пользователю надо назад. Адрес той страницы #заменяется на "Назад." $gburl="javascript:history.back(1)"; } print <<EOF; <html> <head><title>Комментарии</title> <meta http-equiv="refresh" content="1;url= EOF print "$gburl";#Подстановка адреса той страницы в поле автоматического #перенаправления через 1 секунды. print <<EOF; "> <meta http-equiv="cache-control" content="no-cache" > <meta http-equiv="pragma" content="no-cache" > <meta http-equiv="content-type" content="text/html; charset=windows-1251"> <meta http-equiv="content-language" content="ru" > </head> <body> <div align="center"> <p> EOF if (length($errm) == 0) { #Все в порядке. print "$name, ваш комментарий добавлен. Большое спасибо!"; } else { #Возникла какая-то ошибка, ее причина выводится. print "$errm"; } print <<EOF; </p> <p>Через несколько секунд Вы вернётесь <a href=" EOF #Ссылка на ту страницу. print "$gburl"; print <<EOF; ">назад</a> на предыдущую страницу.</p> </div> </body> </html> EOF }
sub loadset{ #Загрузка настроек if (-e "$setfile") { #Если файл настроек найден, то чтение open(SETTINGS,"$setfile"); while (<SETTINGS>) { chomp($_); ($name,$value) = split(/=/,$_,2); $VARS{$name} = $value; } close(SETTINGS); $data="$VARS{data}"; $htmlfile="$VARS{htmlfile}"; $htmlcommfile="$VARS{commfile}"; $adminfile="$VARS{adminfile}"; $sendmail="$VARS{sendmailp}"; $adminmail="$VARS{adminmail}"; $disable_html = "0"; $sendcomm = "0"; $savecomm = "0"; $passwordadm="$VARS{pass}"; $adminurl="$VARS{adminurl}"; $adminkey="$VARS{adminkey}"; $adminname="$VARS{adminname}"; $autorepfile="$VARS{autorepfile}"; if ($VARS{dhtml} =~ /1/){$disable_html ="1";} if ($VARS{sendcomm} =~ /1/){$sendcomm ="1";} if ($VARS{savecomm} =~ /1/){$savecomm ="1";} $adminmail =~ s/\@/\\@/g; #$adminname =~ s/"/\"/g; } else #А если не найден, то установка значений по умолчанию { $data="data/"; $htmlfile="html.txt"; $htmlcommfile="comm.txt"; $adminfile="admin.txt"; $sendmail="/usr/sbin/sendmail"; $disable_html="1"; $sendcomm="0"; $adminmail=""; $savecomm="0"; $passwordadm="3"; $adminurl="admin.pl"; $adminkey=""; $adminname=""; $autorepfile="aurep.txt"; } }
|
|