Начал писать свой форум на перл. Естественно, по ходу возникает очень много вопросов и проблем. Что-то пытаюсь решить сам, но возникают такие проблемы, решение которых я сам найти не могу.
Вот первый из них:
При открытии топа из раздела, выводятся сообщения в этом топе. Проблема в следующем — я не могу сделать так, чтобы сообщения выводились с первого до последнего (т.е. первое — самое верхнее, последнее — самое нижнее), как принято во многих форумах, в данный момент сообщения выводятся наоборот. Ниже даю код и надеюсь на вашу помощь:
if (($sect ne "") and ($id ne "")) { open $AT, "sections/$sect/$id.top"; @ATtheme = <$AT>; close $AT; for ($AT1= 0; $AT1< @ATtheme; $AT1++) { @ATtheme1[$AT1]= @ATtheme[@ATtheme- $AT1- 1]; } #постраничный вывод: $ATpages= int((@ATtheme- 1)/ 10); $Tpage= 0 if ($Tpage< 0) or ($Tpage> $ATpages) or ($Tpage ne int($Tpage)); print "
<table>
<tr>
<td>
<center>\n»;
if ($ATpages> 0)
{
print «Страницы: »;
for ($ATtemp= 0; $ATtemp<= $ATpages; $ATtemp++)
{
print »».($ATtemp+ 1)."</A> » if ($Tpage ne $ATtemp);
print »».($ATtemp+ 1).«</B>\n» if ($Tpage eq $ATtemp);
Назад в раздел</a></center></td></tr>»;
for ($i= $Tpage* 10; ($i< ($Tpage+ 1)* 10) and (@ATtheme1[$i]); $i++)
($ATaut, $ATTheme, $ATmsg, $ATtime) = split(/;;;;;/, @ATtheme1[$i]);
#Вывод непосредственно, сообщения ;)
print »
<table>
<tr>
<td>
<table align=«center» width=«65%»>
<tr>
<td>автор: $ATaut
Тема сообщения:$ATTheme</b>
сообщение добавлено <strong>$ATtime</b></td></tr></strong>
</td>
</tr>
<tr>
<td>$ATmsg</td></tr></table></td></tr>»;
}
}
</td>
</tr>
</table>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ну, проще, видимо, сделать первым поле «Время», тогда сортировать можно.
а так.. если сообщения добавляются в порядке поступления, т.е. последние в конец, то будет достаточно заменить:
на:
кроме того, тут вроде как ошибка есть. размер массива — это скаляр массива. т.е. надо
но, как уже сказал, изящнее использовать reverse.
кстати, при количестве сообщений в пару тысяч и файликом в несколько мегабайт это дело будет жутко тормозить. особенно при многочисленном обращении.
MySQL предлагаешь использовать?
ну, необязательно именно mySQL. но базу данных — это точно.
хотя, как я уже сказал, это только если нагрузка большая.
ОК, спасиб за ответы.
Возник ещё один вопрос по теме. Дело в том, что я собираюсь вводить обязательную регистрацию на форуме. Что посоветуете использовать для безопасности сессии юзера — хеш, сформированный из переменных окружения, или куки?
придуманное одним для шифрования может быть придумано как расшифроват другим…
так что, видимо, в этом плане cookie надёжнее.
кроме того, куки можно использовать для уменьшения траффика. а это иногда бывает очень полезно.
с другой стороны, можно сделать оба варианта и проверять на возможность использования cookie.
В общем, возникла проблемка при выводе топиков из раздела.
В данный момент мой код выводит топики с последнего_добавленного да первого_добавленного, то есть, последний добавленный топ получается внизу, а мне надо наоборот и я не знаю, как это сделать =(
Плюс к этому, хочется к этой части кода добавить постраничный вывод, на каждой странице — по 10 топиков.
Ниже прилагаю нынешний код. Надеюсь на вашу помощь.
<table>
<tr>
<td>
<center>Всего тем в разделе: », $b, «\n»;
print »
Назад на главную</a></center></tr></td>\n»;
#выводим все темы из раздела:
for ($a= 0; $a< $b; $a++)
{
open OTN, «sections/$sect/$a.top»;
@a= ;
$NumStr = @a; #кол-во строк в файле ;))
close OTN;
($Taut, $Ttheme, $Tmsg, $Ttime) = split(/;;;;;/, $a[0]);
($LTaut, $LTtheme, $LTmsg, $LTtime) = split(/;;;;;/, $a[@a-1]);
$NumAns = $NumStr -1; #Кол-во ответов на тему
print »
Заранее благодарен.
<table>
<tr>
<td>
<center>$Ttheme</a>
\n»;
print «Тему создал $Taut</a> в $Ttime
\n»;
#Выводим кол-во ответов:
if ($NumAns != 0)
{
print «Кол-во ответов: $NumAns
»;
}else
{
print «Тема пока что без ответов
»;
}
print «(Последнее сообщение добавил: $LTaut</a> в $LTtime)</center></tr></td>\n»;
}
}
</center>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
И какое затруднение в обратном for?
for ($a= 0; $a< $b; $a++)
меняем на:
for ($a=$b; $a>0; $a--)
Ну, а постранично…
Пусть $page — страница, а $perpage — кол-во тем на странице. Тогда меняем еще раз for на:
for ($a=$page*$perpage; $a>($page-1)*perpage; $a--)
не работает — сейчас у меня две темы в разделе, и предложенный тобой вариант выводит темы в том же порядке, только первая — пустая (т.е. не выводится название, кол-во ответов, кто последний в теме отметился) — просто тема первая куда-то исчезает, а вторая остается на своем месте.
тоже не работает, я задаю
Этот предложенный тобой код выводит на странице раздела 10 тем, когда их там всего 2, причем первая — нормальная (стоит выше всех, она не «перевернулась»), а остальные 9 — пустые (без названия, кол-ва ответов и т.д.), вторая тема из раздела куда-то пропала…
ну, начнём…
Огромное спасибо за помощь.
Но на всякий случай я уточню — итоговый код такой?
<table>
<tr>
<td>
<center>Всего тем в разделе: $b\n»;
print »
Назад на главную</a></center></tr></td>\n»;
#выводим все темы из раздела:
foreach $a (reverse @fnames)
{
open OTN, «sections/$sect/$a»;
@a= ;
$NumStr = @a; #кол-во строк в файле ;))
close OTN;
($Taut, $Ttheme, $Tmsg, $Ttime) = split(/;;;;;/, $a[0]);
($LTaut, $LTtheme, $LTmsg, $LTtime) = split(/;;;;;/, $a[@a-1]);
$NumAns = $NumStr -1; #Кол-во ответов на тему
print »
<table>
<tr>
<td>
<center>$Ttheme</a>
\n»;
print «Тему создал $Taut</a> в $Ttime
\n»;
#Выводим кол-во ответов:
if ($NumAns != 0)
{
print «Кол-во ответов: $NumAns
»;
}else
{
print «Тема пока что без ответов
»;
}
print «(Последнее сообщение добавил: $LTaut</a> в $LTtime)</center></tr></td>\n»;
}
}
</center>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
ну, я бы ещё вот это:
написал бы так:
но это уже мелкие отпимизации… :))
сейчас работает как требуется? за иключением, разве что разюивки на страницы?
нет, выдает ошибку 500… ничего понять не могу, вроде все правильно…
вообще странно..
перезапуск сервера не помогает?
Нет
очень странно…
давай в аську, там пообсуждаем.
надо будет ещё и полный исходник, чтобы это проверить у меня…
в общем, там определимся.