Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Выдача по одной странице с сервера


Автор: haspint 27.4.2008, 09:37
Как написать скрипт, чтоб он выдавал по одной странице (как в поисковых системах). Опишите принцип работы. Если можно ссылочки где почитать по теме

Автор: arto 27.4.2008, 10:48
по одной странице чего?

Автор: haspint 27.4.2008, 11:32
1: Делаю запрос к базе данных
2: Она Возвращает определенный результат(их много)
3: Каждый результат вывести на одной странице
4: переход на следующую страницу осуществляется по ссылке

Так понятно, что я имею в виду?

Автор: nitr 27.4.2008, 12:43
О как! Вроде как обсуждали такое.
Способов как всегда предостаточно, даже есть готовые модули!

Считаем сколько у нас записей (max), выводим к примеру по 100, значит max / 100 = pages, далее запросами и выводим (page - текущая) с (page-1)*100 по page*100. Имхо один из простейших алгоритмов.

Автор: arto 27.4.2008, 12:52
хм. а какая проблема?
выводите результат.
в ссылке ставите признак, что результат уже просмотрен (например, порядковый номер).
при обработке ссылки учитываете признак.

Автор: haspint 27.4.2008, 17:55
не пойму где хранить данные после получения результата запроса, как ето сделать?

Автор: tolkien 27.4.2008, 18:50
1 Способ
Сразу генерте n-го кол страниц. Если их немного то можно все. 

Обработали запрос. 
В ответе 1000 ссылок. 
На страницу вывводите по 100 ссылок. 
Значит создаете 10 страниц html по 100 ссылок в каждой. 

2 Способ
Каждый раз обращаться к базе данных.

Обработали запрос.
В ответе 1000 ссылок.
На страницу выводите по 100 ссылок. Из запроса берете первые 100 ссыллок. Если mysql есть спец конструкция для этого LIMIT n,m (где n - номер начала строки, m - количество возвращаемых строк).
Пример:
SELECT caption, descr FROM books WHERE caption = ? LIMIT= beg_num, 100

Автор: haspint 27.4.2008, 19:56
Если воспользоваться первым способом то как узнать, что пользователь допустим закрыл страницу и ему ети данные больше не нужны, чтобы удалить ети страницы?

Автор: tolkien 27.4.2008, 20:42
1-ый способ
Сделай что нибудь вроде сборки мусора. Напиши скрипт который запускается через кажды n-ый интервал и проверяет у  файлов время последнего доступа. Если доступ был к ним давно то удалить. Или эту проверку можно вставить в скрипт генерации html файлов.

2-ой 
С помощью сессий. Для каждого пользователя открываешь сессию. Когда сессия истечет. Файлы связанные с этой сессией удаляешь.

Автор: gcc 27.4.2008, 23:44
аналог только на пхп http://unixforum.org.ua/index.php?topic=4383.0


Код



$sthh = $dbh->prepare("
        SELECT count(*) FROM com where nam= ?
        ");

$sthh->execute($iddd);

#$sthh->finish();

#$from=1;

($rv)=$sthh->fetchrow_array();





$total_articles_number = $rv;

#$total_articles_number = 79;   #����� ���������� ������
$articles_per_page=10; # ���������� ������ �� ��������
#�������� ���������� �������
#$total_pages = ceil($total_articles_number/$articles_per_page);


$total_pages = floor($total_articles_number/$articles_per_page);



if ($from > $total_pages ) {

$from=$total_pages-1;


}



$jj=0;
#$ii=0;

if ($from eq "") {
$jj=0;
#$ii=0;

#$jj=0;
#$ii=10;
}

else {

$jj=0;
#$ii=0;

$jj=$from*$articles_per_page;
#$ii=($from*$articles_per_page)+10;

}


#print "$jj _ $ii _ $from";







#$sthh->finish();

#$from=1;












$sth = $dbh->prepare("
        select 
id,
nam,
tex,
regr
        from com
        where
        nameid = ?
                LIMIT ?, 10
");

$sth->execute($iddd,$jj);


$dbh->disconnect();


#$sth->finish();


#  $rv = $sth->rows;


#$from=1;

$page_number=-1;




# ��������� ���� - ���������� �������� ����� ���������� �������




print << "[INFO]";

</TABLE>

bla-bla 


<TR>
        <TD background="images/tjpg" WIDTH=263 HEIGHT=100% ALT="" valign="top">


<center>

[INFO]





for ($i=-1; $i<$total_pages; $i++) {
# �������� �������� $from (��� $page_number) ��� ������������� � ������������ ������
#$page_number=$i*$articles_per_page;п╒п╣п╨я│я┌ п║п╬п╬п╠я┴п╣п╫п╦я▐:
# ���� $page_number (���������� ��� �������� ���� �������� �� $from �������) �� ������������� ������� ��������,
# ������� ������ �� �������� �� ��������� $from ������ $page_number
$page_number++;

last if ($total_pages < 1);

next if ($page_number > $from+3);

next if ($page_number < $from-3);



if ($page_number!=$from) {
#$page_number++;
print << "[INFO3]";

 <a href="http://.org/sites/index2.pl?idd=$iddd&from=$page_number"> | $page_number |</a> 

[INFO3]
}
# ����� ������ ������� ����� �������� - ������ ������ �������������,
# ��������� �� �� ������ �������� ���� �� ������� ��������
else {print $i+1;} # ���� page_number - ������� �������� - ������ �� ������� (������ �� ������)
}


извените без коментариев, кодировка слетела smile

Автор: haspint 28.4.2008, 00:28
Всем спасибо за помощь. А чем лучше воспользоваться CGI::Cookies или CGI::Session?

Автор: Itsys 28.4.2008, 07:40
Один вопрос - один пост.

ЗЫ Это тоже самое, что сравнивать ж*пу с пальцем. У каждого модуля свои назначения.

Автор: haspint 29.4.2008, 00:21
тему можно закрыть, еще раз спаибо за помощ

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)