nixp.ru v3.0

26 мая 2017,
пятница,
10:16:58 MSK

DevOps с компанией «Флант»
n0xi0uzz написал 20 августа 2004 года в 03:37 (772 просмотра) Ведет себя как мужчина; открыл 13 тем в форуме, оставил 33 комментария на сайте.

Имеется скрипт статей на моем сайте.

Недавно я решил «прикрутить» к нему комментарии. Написал код, по моему мнению, рабочий. Но при проверке его, работать он отказался. Вот сурс:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
use CGI;
$cgi= new CGI;
$action= $cgi->param("action");
$type= $cgi->param("type");
$id= $cgi->param("id");
$nick= $cgi->param("nick");
$comment= $cgi->param("comment");
&addcom if ($action eq "post");
#подпрограмма добавления комментария к статье:
sub addcom {
#
$lt= "<";
$gt= ">";
$nick=~ s/>/>/g;
$nick=~ s/</</g;
$nick=~ s/;;;;;/:::::/g;
$comment=~ s/>/>/g;
$comment=~ s/</</g;
$comment=~ s/;;;;;/:::::/g;
$comment= substr($comment, 0, 512);
$nick= substr($nick, 0, 64);
$comment=~ s/\n/
/g;
$comment=~ s/\r//g;
@word= split(/ /, $comment);
foreach $word (@word)
{
if (length($word)> 64)
{
$ok= "BAD";
}
}
#
open OC, ">>articles/$type/$id.comm";
@old = ;
close OC;
($old_nick, $old_comment) = split(/;;;;;/, $old[@old-1]);
if ($old_comment eq $comment)
{
$ok = "BAD";
}
#
if (($ok ne "BAD") and ($comment ne ""))
{
open FC, ">>articles/$type/$id.comm";
$to_base = join("", $nick, ";;;;;", $comment, "\n");
print FC $to_base;
close FC;
}
}
#подпрограмма вывода существующих комментариев:
sub viewcom {
if (-e "articles/$type/$id.comm")
{
open VFC, "articles/$type/$id.comm";
@comments = ;
close VFC;
foreach $comments (@comments)
{
($nick, $comment) = split(/;;;;;/, $comments);
print "


<table>
<tr>
<td>$nick:

$comment

<b r="«></tr></td>\n»;</b>

<b r="">}</b>

<b r="">} else</b>

<b r="">{</b>

<b r="">print «</b>
</td>
</tr>
<tr align=«center»>
<td>
<center>Комментариев к данной статье пока нет!</center></td></tr>»;

}

}

#если не указан ни раздел, ни номер статьи, выводим список разделов:

if (($id eq «») and ($type eq «»))

{

print »
<table width=«60%» align=«center»>
<tr align=«center»>
<th>Мои статьи::Разделы</th></tr>»;

print »
</th>
</tr>
<tr>
<td>
<center>»;

open TYPES, «articles/types.cfg»;

@types = ;

close TYPES;

for ($i= @types- 1; $i>=0; $i--)

{

($t, $inf)= split(/;;;;;/, $types[$i]);

print »», $t, «</a>

», $inf, »

»;

}

print «</center></td></tr></table>\n»;

}

#если не указан номер статьи, но указан раздел, выводим список статей из этого раздела:

if (($id eq «») and ($type ne «»))

{

print »
<table width=«60%» align=«center»>
<tr align=«center»>
<th>Мои статьи</th></tr>»;

print »
</th>
</tr>
<tr>
<td>»;

$b= 0;

while (open $a, «articles/$type/$b.cfg»)

{

close $a;

$b++;

}

print »
<center>Всего статей в разделе: », $b, ».

</center>»;

for ($a= 0; $a< $b; $a++)

{

open $b, «articles/$type/$a.cfg»;

@a= <$b>;

close $b;

print »», $a[0], «</a>

»;

}

print «</td></tr></table>\n»;

}

#если указан и номер статьи, и раздел, выводим саму статью:

if (($id ne «») and ($type ne «»))

{

print »
<table width=«60%» align=«center»>
<tr align=«center»>
<th>Мои статьи</th></tr>»;

print »
</th>
</tr>
<tr>
<td>»;

open ART, «articles/$type/$id.cfg»;

@art = ;

close ART;

print »
<center><font size=«3»>», $art[0], «</font></center>

»;

</font>

<font size=«3»>foreach $line (@art)</font>

<font size=«3»>{</font>

<font size=«3»>if ($line ne $art[0])</font>

<font size=«3»>{</font>

<font size=«3»>print $line, «</font>

<font size=«3»>»;</font>

<font size=«3»>}</font>

<font size=«3»>}</font>

<font size=«3»>print «</td></tr>»;</font>

<font size=«3»>print «</font>
\n

Проблема вот в чем: при добавлении комментария в папке articles создается файл .comm с помещенным комментарием. Названия у файла .comm почему-то нет, хотя он должен называться так же, как и перемнная $id и находится он должен в папке по названию перменной $type. Этого почему-то не происходит.

Подскажите, пожалуйста, в чем проблема и какое у неё решение?
<table>
<tr align=«center»>
<th>Комментарии к статье:</th></th>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>»;

&viewcom;

print »
</td>
</tr>
<tr>
<td>
<form action=«articles.pl» method=«post»>»;

print «Ваш ник: <input name=«nick»>

»;

print »
<textarea rows=«10» cols=«40» name=«comment»>
</TEXTAREA>
</textarea>

»;

print «<input name=«action» value=«post» type=«hidden»>»;

print «<input type=«submit» value=«Комментировать»>»;

print «</form>»;

print «</td></tr></table>\n»;

}
</form>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>

scamelscrud

Ну в форме точно надо добавить строки

<input type=«hidden» name=«id» value=«$id»>

<input type=«hidden» name=«type» value=«$type»>

n0xi0uzz

зачем?

а почему возникает такая проблема, описанная мной, не из-за этого же?

scamelscrud

Почему не из-за этого?? Когда у тебя работает addcom она пытается использовать переменные $type и $my

А теперь внимательно смотри какие переменные получает твоя прога, когда ты жмешь кнопарь добавить коментарий.

Если не прописать туда эти две строки, то получается, что у тебя эти переменные просто не объявлены. Пустые они — отсюда и результат.

n0xi0uzz

Понял, спасиб ;)