Forum Webscript.Ru
Программирование => Perl => Тема начата: Ilya от 27 Июля 2001, 16:45:51
-
Всем привет!
Кто подскажет как с помощью "LIMIT" на Perl\'е сделать постраничный промотр MySQL?
-
Должно быть так. Например у тебя блоки линков страниц по 10 штук. Всего страниц, например 56.
Если выбрана страница из 1-10, то выводится: 1-2-3-4-5-6-7-8-9-10 Дальше>>> где дальше линк на страницу 11.
Если выбрана страница из 11-20, то выводится: <<<Назад 11-12-13-14-15-16-17-18-19-20 Дальше>>> где линк "дальше" на страницу 21, а линк "назад" на страницу 10. и т.д.
И последнее. Если выбрана страница из 51-56, то выводится: <<<Назад 51-52-53-54-55-56 где линк "назад" на страницу 50.
Я думаю, что так будет очень логично.
[Изменено 8.8.2001 автор: Realtor from Moscow]
-
select * from TABLE_NAME order by (desc|asc) limit $FROM, $LIMIT;
-
Так я и сам могу :).
Вопрос в том, чтобы сделать навигацию по страницам (::1-10::11-20).
-
Ilya (29-07-2001 17:32):
Так я и сам могу :).
Вопрос в том, чтобы сделать навигацию по страницам (::1-10::11-20).
передавай через QUERY_STRING номер страницы.
$всего_на_одной_странице = 10;
$sqlquery = "... LIMIT ",(номерстраницы*$всего_на_одной_странице)," $всего_на_одной_странице"
-
В это я тоже втыкаю :).
Вот чего не пойму, так это то, как сгенерировать внизу страницы ссылки навигации?
Что на что надо делить? Короче полный п@дец. :) ??? :(.
-
1. ругаться тут не надо.
2. ну раз ты везде и во все "втыкаешь" - что ж ты сразу нам тугодумам не объяснил что тебе конкретно надо?
а страницы генерятся так:
получаешь $resultall - через SELECT БЕЗ LIMIT
примерно так (а то вдруг ты в это случайно не втыкаешь):
$sqlq=" SELECT * FROM table ";
$resultall=mysql_db_query ($db, $sqlquery, $link);
$sqlq .="... LIMIT ",(номерстраницы*$всего_на_одной_странице)," $всего_на_одной_странице";
$result=mysql_db_query ($db, $sqlquery, $link);
значит ceil($resultall/$всего_на_одной_странице) равен количеству страниц необходимых для вывода всей таблицы.
я надеюсь как из этого числа циклом сгенерить ссылки на страницы ты сам "воткнешь"
-
Пояснять не буду, сам поймешь. Больше логики, чем Перла
$my_data=&call_mysql($zapros);
my ($my_data_ref) = $my_data->fetchall_arrayref();
my $table_rows = $my_data->rows;
$count_page = int($table_rows/$count_news_view);
if (($count_page*$count_news_view) < $table_rows) {$count_page++;}
my ($min_page) = int (($page-1)/$max_count_link_page);
$min_page = ($min_page*$max_count_link_page)+1;
my ($max_page) = ($min_page + $max_count_link_page)-1;
if ($min_page == 1) {$prev_page=0;}
else { $prev_page=$min_page-1;
}
$next_page = $max_page+1;
if ($next_page >= $count_page ) {$next_page=0;}
if ($max_page >= $count_page ) {$max_page=$count_page;}
my ($min_news) = (($page-1)*$count_news_view);
my ($max_news) = $min_news+$count_news_view;
if ($max_news >= $table_rows) {$max_news=$table_rows;}
for ($ii=$min_news;$ii<$max_news;$ii++) {
my ($tab_id, $tab_tema, $tab_path) = @{$my_data_ref->[$ii]};
..... вывод
} #end for
print<
end_test
;
if ($prev_page) {
print<<<<Назад |
end_test
;
}
for ($ii=$min_page; $ii<=$max_page;$ii++) {
if ($ii == $page) {
print<$ii |
end_test
;
} # end if
else {
print<$ii |
end_test
;
} # end else
}
if ($next_page) {
print<Дальше>>> |
end_test
;
}
print<
end_test
;
-
AliMamed (30-07-2001 19:05):
получаешь $resultall - через SELECT БЕЗ LIMIT
примерно так (а то вдруг ты в это случайно не втыкаешь):
$sqlq=" SELECT * FROM table ";
$sqlq=" SELECT count(*) FROM table ";
Поскольку все записи не нужны, а нужно лишь их количество.:)
-
Chs (31-07-2001 07:16):
$sqlq=" SELECT count(*) FROM table ";
Поскольку все записи не нужны, а нужно лишь их количество.:)
век живи - век учись :* :)
-
После второй недели медетации мой одурманеный мозГ (чуть не привратившийся в Perl-итерпритатор) сгенерировал мега-код. Кому-нибудь смешно? Нет? Тогда смотрите мега-код! :)
#- - - - - - - - - - - - - - - - - - - -
#!/usr/bin/perl
$perpage = 5;
$dbhost = "localhost";
$dbname = "";
$tblname = "";
$dbuser = "";
$dbpass = "";
use CGI qw /:standard :html3/;
$query = new CGI;
$page = $query->param(\'page\');
if ($page eq ""){$page = 0}
&getdata;
sub getdata {
use DBI;
my $db = DBI->connect ("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpass");
my $query0 = ("SELECT id FROM $tblname");
my $output0 = $db->prepare($query0);
$output0->execute;
$rows = $output0->rows;
$first = $page*$perpage;
my $query = ("SELECT * FROM $tblname limit $first,$perpage");
my $output = $db->prepare($query);
$output->execute;
print "Content-type:text/html\\n\\n";
print "";
while (($pole1, $pole2, $pole3) = $output->fetchrow_array)
{print "$pole1 | $pole2 | $pole3 |
\\n";}
print "
";
&navigation;
}
# - - - - - - - - - - - - - - - - - - - - - - - - -
# А это тот самый мега-код :)
# - - - - - - - - - - - - - - - - - - - - - - - - -
sub navigation {
$pages = int(($rows-1) / $perpage)+1;
$proverka = $pages-1;
$pp = 0;
if ($page != 0 ){
print "<<<Назад - ";
}
else {print "";
}
# - - - - - - - - - - - - - - - - - - - - - - - - -
# The end
# - - - - - - - - - - - - - - - - - - - - - - - - -
-
А если посмотреть на это с другой стороны:
<<< назад - это предыдущая страница, а
вперед >>> - следующая?
Если ты находишься на пятой странице, то нажав на "вперед >>>" переместишься на следующую (шестую страницу). Короче, чтобы просмотреть все страницы, тебе будет нужно нажимать только "вперед >>>".
Ты Yandex\'a знаешь ;)? Посмотри, как там устроена навигация (http://ya.ru), я думаю, что там не может быть не правильно. Мы просто говорим про разные виды навигации.
Ты согласен?
P.S. Поспорить тут можно только о том, какой из них удобней.
-
Simply the best ;)
-
- Для чего предусматривать обработку отрицательного значения $page?
А вдруг какой приколист вручную заGETит URI скрипта? А ты свой сайт укажешь в портфолио при приеме на работу :D
Лучше сразу привыкнуть к стилю программирования. Обрабатывать все возможные ошибки; именовать переменные не $x45, а $line_end и т.д.
- На счет "" - эксплорер и так схавает ;). А если пользователь смотрит в другой смотрелке? Для примера Subscribe.ru мне отказало в открытии рассылки на основании того, что в Netscape полосок оформления не видно :mad:
Тебе сложно вставить пару строк?
- На счет неправильной обработки <<<Назад - Эсли ты на четвертой странице, то предыдущая третья, значит ссылка на предыдущую страницу должна вести на третью страницу :P. Или я не понял твоего замечания?
Дело вследующем: если выбрана страница 4, то генерится строка <<<Назад 1-2-3-4-5-... где <<<Назад линкует на страницу 3. Что в корне не правильно.
- Я только разбираюсь с Perl\'ом, поэтому некоторый код я ваще не могу понять (в данном случае твой). В таких случаях приходится изобретать велосипед (иногда получается только самокат :) ).
Спрашивай - ответим :cool:
-
Так, куда должна вести ссылка "<<<назад"?
-
- Для чего предусматривать обработку отрицательного значения $page?
- На счет "" - эксплорер и так схавает ;).
- На счет неправильной обработки <<<Назад - Эсли ты на четвертой странице, то предыдущая третья, значит ссылка на предыдущую страницу должна вести на третью страницу :P. Или я не понял твоего замечания?
- Я только разбираюсь с Perl\'ом, поэтому некоторый код я ваще не могу понять (в данном случае твой). В таких случаях приходится изобретать велосипед (иногда получается только самокат :) ).
-
Согласен, но мне кажется более логичным мой способ :D
-
Замечания:
- не предусмотрено обработки отрицательного значения $page;
- в sub navigation неправильно определен тег (нет сопутствующих |
);
- $pp=++$pp пишется $pp++;
- $pages=($pages-1) пишется $pages--;
- непраильно обрабатывается вывод <<<Назад. По скрипту следует, что выводятся все страницы. Если $page=4, то выведется 1-2-3-4-5-6-..... И указатель <<<Назад будет на страницу 3.
Короче вывод навигации надо осуществлять блоками по 1-10, 11-20 и т.д. (Размер блока на твоей совести). А таким макаром все время будет глюк в навигации.
Я тебе правильную мысль давал в своем примере. Посмотри внимательнее :P