Вывод 10 номер страниц из 30 в каталоге ссылок

Гриша К.

Новичок
Я уже закипел, честное слово.
Я у себя повыводил все переменные при помощи echo, но у меня просто нет тех необходимых знаний, чтобы подумать над этим правильно.
Я какую то муть уже делаю

PHP:
$num_pages=ceil($total_rows/$per_page);    

$pergroup = 10;   

$page+=1; //Это как раз равняется текущеме номеру страницы - 1
$groupnumber = floor($page/$pergroup); 
while($groupnumber<=0)
	{$groupnumber=0.1;}
Тут строницы выводятся с 1 по 10, при нажатии на 10 страницу выводятся страницы с 10 по 17, а у меня страниц 18.

Я догнла что floor уберает десятичные знаки.

Я уже думаю с 12:30, так хочется до завтра это сдлеать.
Когда стану денег зарабатывать нормально, буду платить программистам, а сам небуду связываться с прогрммированием. Приходится щас самому все делать.
Можете мне помочь, пожалуйста?

-~{}~ 30.12.05 18:31:

НУ ПОДСКАЖИТЕ НАД КАКОЙ ЧАСТЬЮ КОДА ПОДУМАТЬ, ЧТО НЕ ТАК, ПО ПРИМЕ НА 1 странице в самом конце.

-~{}~ 30.12.05 18:47:

Немогу никак разобраться. Ну почему перед новым годом такой геморой, ну почему вы неможете написать ответ. Ну поймите же вы, что я зашел на форму для того, что бы получить ответ, а не рассуждать весь день по поводу скрипта и в итоге ничего не сделать, ну это бред.
ПОДСКАЖИТЕ ПОЖАЛУЙСТА РЕШЕНИЕ.
 

ksnk

прохожий
PHP:
for($i=max(1,$page-10);$i<=min($total_rows,$page+10);$i++) {...
Попробуй, к примеру так....
 

alexhemp

Новичок
Гриша К.

У тебя уже 130 сообщений на форуме и никто не показал тебе http://phpfaq.ru/debug ?

А задача твоя - не просто простая, а очень простая.

Составь алгортим в СЛОВЕСНОЙ ФОРМЕ а потом пошагово его реализовывай. Тыканье "где попало" ни к какому результату не приведут.

Вот тебе новогодний подарок:

1. Определи общее количество страниц
2. Определи текущую страницу
3. Определи первую страницу, что будет показываться
4. Определи последнюю страницу что будет показываться
5. Выводи в цикле ссылки на страницы от первой до последней
5.1. Если номер страницы совпадает с текущим - ссылку не выводим.

Если алгоритм понятен - то код очевиден.
По частным вопросам тебе уже ответили.
 

Гриша К.

Новичок
ksnk, спасибо за ответ. В вашем варианте получается так, что при переходи на следующую страницу, кол-во страниц увеличивается на 1, то есть сначал отображается с 1 по 10, при попадании на вторуюстраницу отображается, с 1 по 11 и т.д., до бесконечности.


alexhemp, спасибо за ответ. Я точно помню вы мне уже помогали. Я кстати только что заметил, что я оказывается продвинутый новичок.

Спасибо за подарок.
Помойму если я правильно понял вы мне привели алгоритм написания скрипта по выводу всего кол-ва страниц из базы данных.
Это у меня есть, у меня есть 18 страниц, на ту страницу которую я нажимаю он не отображается в виде ссылки.
Проблема в том, что когда у меня 30 страниц, я хочу выводить их по частям, по 10. При нажатии на 10 страницу открываются страницы с 10 по 19 и т.д.
Щас чуть чуть отдохнул буд еще пробовать.

-~{}~ 31.12.05 01:01:


/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/


:D ТУЦ-тУЦ Ту-Ду-ДУц Шмякыч КвардГерц!!! - Я мастер-молодец Я выполнил свой план на этот году по каталогу.
Я сделал вывод страниц. Ниже привожу полный готовый код.

Страницы выводятся таким образом.
К примеру у нас 30 страниц, и мы хотим выводить по 10 страниц:
# Первые 10, при нажатии на ... попадаем на следующие 10
1 2 3 4 5 6 7 8 9 10 ...
<< следующая предыдущая >>
# Вторые 10, при нажатии на ... попадаем на предыдущие 10 или нажимаем на ..., которые спарва, попадаем на следущие 10
... 11 12 13 14 15 16 17 18 19 20 ...
<< следующая предыдущая >>
# Третьи 10, при нажатии на ... попадаем на предыдущие 10
... 21 22 23 24 25 26 27 28 29 30
<< следующая предыдущая >>

Достаточно поменять $pergroup на нужное кол-во страниц в блоке и все, красота.


Спасибо большое всем за помощь, особенно white phoenix, он предложил вариант, на основе которого я все изделал, хотя я полностью разобрался в скрипте, но если бьы я делал без его примера, у менябы были громозкие вычесления. И также дополнительное спасибо zarus, за его дополнение к скрипту (я узнал про функцию min) и за ...($_GET['page'] > 0), сам я несооброзил.
============================================

PHP:
// количество записей, выводимых на странице
$per_page=10;
// получаем номер страницы
if (isset($_GET['page']) && ($_GET['page'] > 0)) $page=($_GET['page']-1); else $page=0; // Мленькое добавленице  && ($_GET['page'] > 0) - так, что если страница равна 0 или -1 и т.д., то отбражается первая страница
// вычисляем первый оператор для LIMIT
$start=abs($page*$per_page);
// составляем запрос и выводим записи
// переменную $start используем, как нумератор записей.
$q="SELECT * FROM `table` ORDER BY field LIMIT $start,$per_page";
$res=mysql_query($q);
while($row=mysql_fetch_array($res)) {
  echo ++$start.". ".$row['field']."<br>\n";
}

// дальше выводим ссылки на страницы:
$q="SELECT count(*) FROM `table`";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];
$num_pages=ceil($total_rows/$per_page);

$pergroup=10; //Определяем кол-во выводимых страниц в группе
$groupnumber = floor($page/$pergroup); //Определяем номер группы из указанного кол-ва страниц
$gropuprevious = $groupnumber*$pergroup; //Определяем предыдущую страницу текущей группы 
$groupnext = min($groupnumber*$pergroup+$pergroup,$num_pages); //Определяем следующую страницу после текущей группы

if ($gropuprevious>=$pergroup) //Выводим ссылку предыдущей страницы текущей группы
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.$gropuprevious.'">...</a> ';

for($i=$gropuprevious+1;$i<=$groupnext;$i++) //Выводим страницы в виде ссылок по группам в указанном кол-ве, текущие страницы выводим без ссылок
//for($i=1;$i<=$num_pages;$i++) {
  if ($i-1 == $page) {
    echo $i." ";
  } else {
    echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i."</a> ";
  }
}

if ($groupnext<$num_pages) //Вывожу ссылку на следующу страницу после текущей группы
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.($groupnext+1).'">...</a> ';

echo '<br>';

if ($page+1>1) //Если страница не последня, то вывожу кнопку previous (предыдущая)
 {
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.$page.'"><< предыдущая</a> &nbsp;';
 }
elseif ($num_pages>1) //Если страница одна то не выводим эту ссылку	
echo '<< предыдущая &nbsp;'; 

if ($page+1<$num_pages) //Если страница не последня, то вывожу кнопку next (следующая)
{
echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.($page+2).'">cледующая >></a>';
}
elseif ($num_pages>1) //Если страница одна то не выводим эту ссылку	
echo 'cледующая >>';
 

zarus

Хитрожопый макак
Косяки есть, но в целом неплохо, надо взять на вооружение.

-~{}~ 10.01.06 12:35:

PHP:
// Количество записей из БД, выводимых на странице (размер страницы)
$page_size = 5;
// Количество ссылок на страницы, видимых пользователю
$pages_group = 10;
// Общее количество записей в БД
$page_total = 1;
$res = mysql_query('SELECT count(*) FROM `table`');
if (false !== ($row = mysql_fetch_row($res))) {
  $page_total = $row[0];
}
// Максимальное количество страниц
$pages_max = ceil($page_total/$page_size);
// Получаем номер страницы, запрошенной пользователем.
//  Если страница не указана, указана неверно или выходит за границу диапазона, то по умолчанию - первая
$pages_current = 1;
if (isset($_GET['page'])) {
  $_GET['page'] = intval($_GET['page']);
  $pages_current = ($_GET['page'] > 0 && $_GET['page'] < $pages_max+1) ? $_GET['page']-1 : 1;
}
//Определяем номер группы из указанного кол-ва страниц
$group_current  = floor($pages_current / $pages_group); 
//Определяем предыдущую страницу текущей группы
$group_previous = $group_current * $pages_group;
//Определяем следующую страницу после текущей группы
$group_next     = min($group_current * $pages_group + $pages_group, $pages_max); 
if ($group_current > 0) {
  //Выводим ссылку на последнюю страницу предыдущей группы страниц
  echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.$group_previous.'"><<</a> ';
}
if ($pages_current > $group_previous) {
  //Если выбранная страница не первая в группе, то выводим ссылку на предыдущую страницу
  echo '<a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.($pages_current).'"><</a> ';
}

for ($i = $group_previous + 1; $i <= $group_next; $i++) {
  // Выводим страницы в виде ссылок по группам в указанном кол-ве, текущие страницы выводим без ссылок
  if ($i == $group_previous + 1) {
    echo '[ ';
  }
  if ($i == $pages_current + 1) {
    echo '<b>'.$i.'</b>';
  } else {
    echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a>';
  }
  if ($i == $group_next) {
    echo ' ]';
  } else {
    echo ' | ';
  }
}

if ($pages_current < $group_next - 1) {
  // Если выбранная страница не последняя в группе, то выводим ссылку на следующую страницу
  echo ' <a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.($pages_current + 2).'">></a>';
}
if ($group_next < $pages_max) {
  //Выводим ссылку на следующу страницу после текущей группы
  echo ' <a href="'.ereg_replace('index.php', '', $_SERVER['PHP_SELF']).'?page='.($group_next + 1).'">>></a> ';
}
echo '<br>';
// Выводим записи из БД
$start = $pages_current*$page_size;
//  Вычисляем интервал выборки записей из БД
$res = mysql_query('SELECT `field` FROM `table` LIMIT '.$start.','.$page_size);
while (false !== ($row = mysql_fetch_row($res))) {
  // Выводим записи
  //  Переменную $start используем, как нумератор записей.
  echo ++$start.". ".$row[0]."<br>\n";
}
 
Сверху