Forum Webscript.Ru

Программирование => Perl => Тема начата: Ilya от 27 Июля 2001, 16:45:51

Название: Постраничный просмотр MySQL
Отправлено: Ilya от 27 Июля 2001, 16:45:51
Всем привет!
Кто подскажет как с помощью "LIMIT" на Perl\'е сделать постраничный промотр MySQL?
Название: Постраничный просмотр MySQL
Отправлено: Realtor from Moscow от 09 Августа 2001, 02:07:10
Должно быть так. Например у тебя блоки линков страниц по 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]
Название: Постраничный просмотр MySQL
Отправлено: Light Elf от 28 Июля 2001, 07:19:32
select * from TABLE_NAME order by (desc|asc)  limit $FROM, $LIMIT;
Название: Постраничный просмотр MySQL
Отправлено: Ilya от 29 Июля 2001, 17:32:00
Так я и сам могу :).
Вопрос в том, чтобы сделать навигацию по страницам (::1-10::11-20).
Название: Постраничный просмотр MySQL
Отправлено: AliMamed от 29 Июля 2001, 23:30:31
Цитировать
Ilya (29-07-2001 17:32):
Так я и сам могу :).
Вопрос в том, чтобы сделать навигацию по страницам (::1-10::11-20).
передавай через QUERY_STRING номер страницы.
$всего_на_одной_странице = 10;
$sqlquery = "... LIMIT ",(номерстраницы*$всего_на_одной_странице)," $всего_на_одной_странице"
Название: Постраничный просмотр MySQL
Отправлено: Ilya от 30 Июля 2001, 18:28:23
В это я тоже втыкаю :).
Вот чего не пойму, так это то, как сгенерировать внизу страницы ссылки навигации?
Что на что надо делить? Короче полный п@дец. :) ???  :(.
Название: Постраничный просмотр MySQL
Отправлено: AliMamed от 30 Июля 2001, 19:05:53
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/$всего_на_одной_странице) равен количеству страниц необходимых для вывода всей таблицы.

я надеюсь как из этого числа циклом сгенерить ссылки на страницы ты сам "воткнешь"
Название: Постраничный просмотр MySQL
Отправлено: Realtor from Moscow от 31 Июля 2001, 03:23:22
Пояснять не буду, сам поймешь. Больше логики, чем Перла

$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<
end_test
;
} # end if
else {
print<
end_test
;
} # end else
}
if ($next_page) {
print<
end_test
;
}
print<
<<<Назад  $ii  $ii  Дальше>>>  


end_test
;
Название: Постраничный просмотр MySQL
Отправлено: Chs от 31 Июля 2001, 07:16:06
Цитировать
AliMamed (30-07-2001 19:05):
получаешь $resultall - через SELECT БЕЗ LIMIT
примерно так (а то вдруг ты в это случайно не втыкаешь):
$sqlq=" SELECT * FROM table ";
$sqlq=" SELECT count(*) FROM table ";
Поскольку все записи не нужны, а нужно лишь их количество.:)
Название: Постраничный просмотр MySQL
Отправлено: AliMamed от 31 Июля 2001, 10:13:43
Цитировать
Chs (31-07-2001 07:16):
$sqlq=" SELECT count(*) FROM table ";
Поскольку все записи не нужны, а нужно лишь их количество.:)

век живи - век учись  :* :)
Название: Постраничный просмотр MySQL
Отправлено: Ilya от 04 Августа 2001, 18:19:54
После второй недели медетации мой одурманеный мозГ (чуть не привратившийся в 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 "\\n";}
print "
$pole1$pole2$pole3
";
&navigation;
}

# - - - - - - - - - - - - - - - - - - - - - - - - -
# А это тот самый мега-код :)
# - - - - - - - - - - - - - - - - - - - - - - - - -

sub navigation {

$pages = int(($rows-1) / $perpage)+1;
$proverka = $pages-1;
$pp = 0;
if ($page != 0 ){
print "<<<Назад - ";
}
else {print "
- "}
while ($pages > 0)
{
print "";
$pp = ++$pp;
if ($page == ($pp-1)){print "$pp
"}
else {print "$pp"}
print " - ";
$pages = ($pages-1);
}
if ($proverka != $page){
print "Вперед>>>";
}
print "
";

}
# - - - - - - - - - - - - - - - - - - - - - - - - -
# The end
# - - - - - - - - - - - - - - - - - - - - - - - - -
Название: Постраничный просмотр MySQL
Отправлено: Ilya от 09 Августа 2001, 10:59:26
А если посмотреть на это с другой стороны:
<<< назад - это предыдущая страница, а
вперед >>> - следующая?
Если ты находишься на пятой странице, то нажав на "вперед >>>" переместишься на следующую (шестую страницу). Короче, чтобы просмотреть все страницы, тебе будет нужно  нажимать только "вперед >>>".

Ты Yandex\'a знаешь ;)? Посмотри, как там устроена навигация (http://ya.ru), я думаю, что там не может быть не правильно. Мы просто говорим про разные виды навигации.

Ты согласен?

P.S. Поспорить тут можно только о том, какой из них удобней.
Название: Постраничный просмотр MySQL
Отправлено: Ilya от 10 Августа 2001, 11:20:55
Simply the best ;)
Название: Постраничный просмотр MySQL
Отправлено: Realtor from Moscow от 07 Августа 2001, 23:56:56
Цитировать
- Для чего предусматривать обработку отрицательного значения $page?

А вдруг какой приколист вручную заGETит URI скрипта? А ты свой сайт укажешь в портфолио при приеме на работу :D
Лучше сразу привыкнуть к стилю программирования. Обрабатывать все возможные ошибки; именовать переменные не $x45, а $line_end и т.д.

Цитировать
- На счет "" - эксплорер и так схавает ;).
А если пользователь смотрит в другой смотрелке? Для примера Subscribe.ru мне отказало в открытии рассылки на основании того, что в Netscape полосок оформления не видно :mad:
Тебе сложно вставить пару строк?

Цитировать
- На счет неправильной обработки <<<Назад - Эсли ты на четвертой странице, то предыдущая третья, значит ссылка на предыдущую страницу должна вести на третью страницу :P. Или я не понял твоего замечания?
Дело вследующем: если выбрана страница 4, то генерится строка <<<Назад 1-2-3-4-5-... где <<<Назад линкует на страницу 3. Что в корне не правильно.

Цитировать
- Я только разбираюсь с Perl\'ом, поэтому некоторый код я ваще не могу понять (в данном случае твой). В таких случаях приходится изобретать велосипед (иногда получается только самокат :) ).
 
Спрашивай - ответим :cool:
Название: Постраничный просмотр MySQL
Отправлено: Ilya от 08 Августа 2001, 13:20:01
Так, куда должна вести ссылка "<<<назад"?
Название: Постраничный просмотр MySQL
Отправлено: Ilya от 07 Августа 2001, 11:18:38
- Для чего предусматривать обработку отрицательного значения $page?
- На счет "
" - эксплорер и так схавает ;).
- На счет неправильной обработки <<<Назад - Эсли ты на четвертой странице, то предыдущая третья, значит ссылка на предыдущую страницу должна вести на третью страницу :P. Или я не понял твоего замечания?
- Я только разбираюсь с Perl\'ом, поэтому некоторый код я ваще не могу понять (в данном случае твой). В таких случаях приходится изобретать велосипед (иногда получается только самокат :) ).
Название: Постраничный просмотр MySQL
Отправлено: Realtor from Moscow от 10 Августа 2001, 01:04:22
Согласен, но мне кажется более логичным мой способ :D
Название: Постраничный просмотр MySQL
Отправлено: Realtor from Moscow от 05 Августа 2001, 03:53:59
Замечания:
- не предусмотрено обработки отрицательного значения $page;
- в sub navigation неправильно определен тег
(нет сопутствующих );
- $pp=++$pp пишется $pp++;
- $pages=($pages-1) пишется $pages--;
- непраильно обрабатывается вывод <<<Назад. По скрипту следует, что выводятся все страницы. Если $page=4, то выведется 1-2-3-4-5-6-..... И указатель <<<Назад будет на страницу 3.

Короче вывод навигации надо осуществлять блоками по 1-10, 11-20 и т.д. (Размер блока на твоей совести). А таким макаром все время будет глюк в навигации.
Я тебе правильную мысль давал в своем примере. Посмотри внимательнее :P