Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
Сессии 25.08.04 11:48 Число просмотров: 2680
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
|
Я с сессиями работал только на php - там весьма удобно все сделано. На перле с таким вопросом не сталкивался, но не думаю, что все это очень уж сложно ;-)
В общем:
perldoc CGI::Session
perldoc Apache::Session
или вот тут:
perldoc CGI::Session perldoc Apache::Session и вообще тут
|
<web building>
|
Форум на perl - первые проблемы. 25.08.04 10:19
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
|
Начал писать свой форум на перл. Естественно, по ходу возникает очень много вопросов и проблем. Что-то пытаюсь решить сам, но возникают такие проблемы, решение которых я сам найти не могу.
Вот первый из них:
При открытии топа из раздела, выводятся сообщения в этом топе. Проблема в следующем - я не могу сделать так, чтобы сообщения выводились с первого до последнего (т.е. первое - самое верхнее, последнее - самое нижнее), как принято во многих форумах, в данный момент сообщения выводятся наоборот. Ниже даю код и надеюсь на вашу помощь:
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 "<tr><td><center>\n";
if ($ATpages> 0)
{
print "Страницы: ";
for ($ATtemp= 0; $ATtemp<= $ATpages; $ATtemp++)
{
print "<A href=?sect=$sect&id=$id&Tpage=".$ATtemp.">".($ATtemp+ 1)."</A> " if ($Tpage ne $ATtemp);
print "".($ATtemp+ 1)."\n" if ($Tpage eq $ATtemp);
}
}
print "<br><a href=forum.pl?sect=$sect>Назад в раздел</a></center></td></tr>";
#
for ($i= $Tpage* 10; ($i< ($Tpage+ 1)* 10) and (@ATtheme1[$i]); $i++)
{
($ATaut, $ATTheme, $ATmsg, $ATtime) = split(/;;;;;/, @ATtheme1[$i]);
#Вывод непосредственно, сообщения ;)
print "<tr><td><table align=center width=65%><tr><td>автор: $ATaut<br>Тема сообщения:$ATTheme<br>сообщение добавлено $ATtime</td></tr><tr><td>$ATmsg</td></tr></table></td></tr>";
}
}
|
|
Ещё одна проблема 26.08.04 12:11
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
|
В общем, возникла проблемка при выводе топиков из раздела.
В данный момент мой код выводит топики с последнего_добавленного да первого_добавленного, то есть, последний добавленный топ получается внизу, а мне надо наоборот и я не знаю, как это сделать =(
Плюс к этому, хочется к этой части кода добавить постраничный вывод, на каждой странице - по 10 топиков.
Ниже прилагаю нынешний код. Надеюсь на вашу помощь.
if (($sect ne "") and ($id eq "") and ($Tpage eq "") and ($act eq ""))
{
#считаем кол-во топиков в теме
$b= 0;
while (open $a, "sections/$sect/$b.top")
{
close $a;
$b++;
}
print "<tr><td><center>Всего тем в разделе: ", $b, "\n";
print "<br><a href=\"forum.pl\">Назад на главную</a></center></tr></td>\n";
#выводим все темы из раздела:
for ($a= 0; $a< $b; $a++)
{
open OTN, "sections/$sect/$a.top";
@a= <OTN>;
$NumStr = @a; #кол-во строк в файле ;))
close OTN;
($Taut, $Ttheme, $Tmsg, $Ttime) = split(/;;;;;/, $a[0]);
($LTaut, $LTtheme, $LTmsg, $LTtime) = split(/;;;;;/, $a[@a-1]);
$NumAns = $NumStr -1; #Кол-во ответов на тему
print "<tr><td><center><a href=\"forum.pl?sect=$sect&id=$a\">$Ttheme</a><br>\n";
print "Тему создал <a href=forum.pl?act=viewauth&user=$Taut>$Taut</a> в $Ttime<br>\n";
#Выводим кол-во ответов:
if ($NumAns != 0)
{
print "Кол-во ответов: $NumAns<br>";
}else
{
print "Тема пока что без ответов<br>";
}
print "(Последнее сообщение добавил: <a href=forum.pl?act=viewauth&user=$LTaut>$LTaut</a> в $LTtime)</center></tr></td>\n";
}
}
Заранее благодарен.
|
| |
Сделай по аналогии с предыдущим. 26.08.04 12:49
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman Отредактировано 26.08.04 12:51 Количество правок: 1
|
И вообще, блин, если хочешь нормальной помощи - дай хотя бы описание структуры форума. Потому как догадываться, что такое топики, темы, разделы, сообщения, что из них выше в иерархии, откуда что берется лично мне - влом (да и не только мне).
Так что будь добр, дай нормальную спецификацию!
И еще - у меня складывается впечатление, что ты где-то взял готовый код и просто хочешь, чтобы его за тебя переделали. Так не пойдет!
Или разубеди меня - опиши, к примеру, что ты делал, чтобы добиться ответа на вопрос, и что у тебя из этого получилось - а мы подскажем, в каком именно месте ты ошибся.
|
| | |
Хм.. 26.08.04 15:01
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member Отредактировано 26.08.04 15:03 Количество правок: 1
|
> И еще - у меня складывается впечатление, что ты где-то взял > готовый код и просто хочешь, чтобы его за тебя переделали. > Так не пойдет! > Или разубеди меня - опиши, к примеру, что ты делал, чтобы > добиться ответа на вопрос, и что у тебя из этого получилось > - а мы подскажем, в каком именно месте ты ошибся.
Да не собираюсь я никого разубеждать, это МОЙ код, это Я часами просиживаю за ним и всего лишь попросил вашей помощи, если тебе влом помочь, то не момогай, я же не заставляю ;) Просто я первый раз пишу такой крупный проект и я знаю, что у меня проблемы с пониманием циклов for...
> Потому как догадываться, что > такое топики, темы, разделы, сообщения, что из них выше в > иерархии, откуда что берется лично мне - влом (да и не > только мне).
Объясняю иерархию форума:
Сначала идет раздел, в разделе находятся топики, а в топике - сообщения... (я думал, это всем понятно)...
Разделы находятся в папке sections. Название раздела (параметр $sect) - название папки. В каждой папке раздела находятся топики в виде файлов $id.top, где $id - номер топа, номера идут от 0 и далее.
Вроде все, если ещё что-то не понятно - скажите, я объясню ;)
Все ещё надеюсь на вашу помощь. Заранее благодарен...
|
| | | |
Ну что, разобрался? 30.08.04 14:19
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman Отредактировано 30.08.04 14:20 Количество правок: 1
|
> Просто я первый раз пишу такой крупный проект > и я знаю, что у меня проблемы с пониманием циклов for...
Это зря. может, лучше сперва разобраться?
> Объясняю иерархию форума: > Сначала идет раздел, в разделе находятся топики, а в топике > - сообщения... (я думал, это всем понятно)... > Разделы находятся в папке sections. Название раздела > (параметр $sect) - название папки. В каждой папке раздела > находятся топики в виде файлов $id.top, где $id - номер > топа, номера идут от 0 и далее.
А первая строка в файле, насколько я понимаю, помимо всего прочего содержит название топика?
Все ведь достаточно просто:
Ты выводишь топики с нулевого по последний. Нулевой - самый старый. последний - самый свежий. твой код:
for ($a= 0; $a< $b; $a++)
{...}
---
где $b - общее количество топиков в теме.
Для обратного вывода тебе стоит лишь обратить порядок вывода:
for ($a= ($b-1); $a>=0; $a--)
{...}
---
и будет тебе счастье ;-)
P.S. пользуйся тегом <рre></рre>, иначе твой код читать не очень удобно.
|
| | | |
Нокс.. Я уже мильйон раз объяснял.. 27.08.04 04:15
Автор: !? <!?> Статус: Member
|
Перевожу на русский эту строку — for ($a= 0; $a< $b; $a++):
Для переменной $a (начальное значение — 0), при верности условия $a< $b определить цикл {ЦИКЛ} при этом увеличивая $a на один между итерациями.
А теперь переводи то что хочешь на аналогичный «русский» и пиши цикл.
С постраничным переводом туда же.
|
| | | | |
Да в том-то и проблема, я "расшифровать" имеющееся могу, а... 27.08.04 04:48
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
|
> Перевожу на русский эту строку — for ($a= 0; $a< $b; > $a++): > Для переменной $a (начальное значение — 0), при верности > условия $a< $b определить цикл {ЦИКЛ} при этом > увеличивая $a на один между итерациями. > > А теперь переводи то что хочешь на аналогичный «русский» и > пиши цикл. > С постраничным переводом туда же.
Да в том-то и проблема, я "расшифровать" имеющееся могу, а составить свое, или изменить имеющееся - нет =( поэтому и попросил помочь...)
[offtop]
Дмитрий, выйди на связь ;) Аська, там, ирка - как те удобнее ;)
[/offtop]
|
|
Я думаю, что так: 25.08.04 11:14
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman Отредактировано 25.08.04 11:14 Количество правок: 1
|
Вот этот код:
for ($AT1= 0; $AT1< @ATtheme; $AT1++)
{@ATtheme1[$AT1]= @ATtheme[@ATtheme- $AT1- 1];}
---
отвечает за сортировку твоих сообщений. Ты берешь их из текстового файла, в котором последняя запись соответствует самому свежему сообщению и сортируешь их в обратном порядке, так?
Таким образом, у тебя получается, что в массиве ATtheme1 самое свежее сообщение - самое первое.
Следовательно, в твоем скрипте самое верхнее сообщение будет соответствовать самому последнему в файле, то есть самому свежему.
Если тебя такой порядок не устраивает, поменяй этот код на
for ($AT1= 0; $AT1< @ATtheme; $AT1++)
{@ATtheme1[$AT1]= @ATtheme[$AT1];}
---
или просто замени все вхождения ATtheme1 на ATtheme
|
| |
Ещё вопрос ;) 25.08.04 11:25
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
|
Спасибо за совет, теперь все работает.
Теперь меня интересует следующая проблема, точнее, дилема:
я буду вводить на форуме обязательную регистрацию, но я не знаю, что лучше использовать для безопасности аккаунтов - хеш, сформированный из переменных окружения, или куки? а может, есть другие варианты?
проконсультируйте меня, пожалуйста, по этому вопросу...
|
| | |
Сессии 25.08.04 11:48
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
|
Я с сессиями работал только на php - там весьма удобно все сделано. На перле с таким вопросом не сталкивался, но не думаю, что все это очень уж сложно ;-)
В общем:
perldoc CGI::Session
perldoc Apache::Session
или вот тут:
perldoc CGI::Session perldoc Apache::Session и вообще тут
|
| | |
аккаунтов? Куки не подойдут для хранения аккаутнов, так как... 25.08.04 11:47
Автор: DgtlScrm Статус: Member
|
> Теперь меня интересует следующая проблема, точнее, дилема: > я буду вводить на форуме обязательную регистрацию, но я не > знаю, что лучше использовать для безопасности аккаунтов - > хеш, сформированный из переменных окружения, или куки? а > может, есть другие варианты?
аккаунтов? Куки не подойдут для хранения аккаутнов, так как хранятся на клиенте :) Может ты имеешь ввиду сессии? Так или иначе, на севрере хранить пароли желательно в хеше, хотя с последними новостями про md5 это может не помочь... поэтому скомбинируй хеш с каким-либо линейниы алгоритмом шифрования...
Для сессии генерируй отдельный случайный идентификатор. Его можешь кидать в куки, тогда человек сможет закрыть окно с форумом а когда зайдет на него через 5 минут ему не прийдется снова вводить логин/пароль...
|
| | | |
Извините, вы меня не так поняли ;) 25.08.04 13:51
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
|
> аккаунтов? Куки не подойдут для хранения аккаутнов, так как > хранятся на клиенте :) Может ты имеешь ввиду сессии? Так > или иначе, на севрере хранить пароли желательно в хеше, > хотя с последними новостями про md5 это может не помочь... > поэтому скомбинируй хеш с каким-либо линейниы алгоритмом > шифрования... > > Для сессии генерируй отдельный случайный идентификатор. Его > можешь кидать в куки, тогда человек сможет закрыть окно с > форумом а когда зайдет на него через 5 минут ему не > прийдется снова вводить логин/пароль...
Я не для сохранения сказал, а для безопасности ;)
Так лучше использовать и хеш, и пароль?
|
| | | | |
У клиента на компе в том или ином виде должен храниться... 25.08.04 21:56
Автор: Heller <Heller> Статус: Elderman
|
У клиента на компе в том или ином виде должен храниться только его id и хеш. Причём id хранить и не обязательно - при грамотной генерации хеша. Однако я в своё время делал вот как: клиент хранил у себя id и "типа хеш" - который являлся случайно сгенерированным числом. Каждый раз при авторизации это число генерировалось занаво, а через какое-то время теряло свою актуальность (вместе с числом я хранил время последнего его использования).
Что выбрать - кукисы или адресную строку - вопрос спорный. Вообще люди, занимающиеся секьюрити рекомендуют в большинстве своём воздерживаться от использования кукисов, однако я не согласен. Мой собственный опыт показывает, что упереть можно как то, так и другое, но кукисы вообще говаря на порядок удобнее. Ещё можно для перехода по ссылкам можно использовать какую-нибудь функцию javascript, которая будет подставлять во время перехода значение хеша, и будет вызываться так:
<a href="javascript:play('куда_перейти','хеш')">
Таким образом хеш вытянуть станет практически нереально.
|
|
|