Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод значения переменной на страницу. 
:(
    Опции темы
Gooos
Дата 20.5.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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";
}
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0888 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.