PHP и MySQL. Реализация БЛОГовой структуры

Статус
Закрыто для дальнейших ответов.

Lem

Новичок
Регистрация
25.03.2010
Сообщения
1
Доброго времени суток. Сразу к делу...
Очень интересно, как реализовать вывод инфы из БД постранично?
Ну, к примеру.... у меня 158 записей. Если выводить их в обычном цикле, то все они будут выведены на одной странице, что делает процесс ознакомления более напряжным. Решением может служить постраничный вывод записей (к примеру, по 10 на страницу!). Интересно узнать, как реализовать вывод ограниченного числа записей из БД со "списком" последующих страниц?
Например как тут: http://evgeniypopov.com/articles.php

Заранее спасибоУ!)
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
Код:
 $pnumber = 10; //кол-во сообщений на странице
 //определяем страницу по GET-параметру
 $pn = (int)$_GET('pn'); 
 if ($pn <= 0) $pn = 1;
 
 //считаем количество сообщений
 $count = 0;
 $query = "SELECT count(*) FROM posts";
 if($tot = @mysql_query($query)) $count	= @mysql_result($tot,0);

 //формируем строку со ссылками на страницы
 $begin = 0;
 $output = "";
 $aPicker = SetRangePicker($pn, $pnumber, $count, 5, true, false, "");
 $begin = $aPicker[1];
 $output = $aPicker[0];
 $query = "SELECT * FROM posts LIMIT $begin, $pnumber";
 //дальше вывод
 ...
 echo $output;
Код:
################################################
# ФУНКЦИЯ SetRangePicker - выдаёт строку с номерами страниц результатов
# Пример: "Страницы результатов: << 11 12 13 14 15 16 >> ( 361 - 390 )"
# где 
# << - ссылка на предыдущую страницу (в данном случае 10ю)
# 11 12 ... - ссылки на номера страниц
# 13 - текущая страница (без ссылки)
# >> - ссылка на следующую страницу (17ю)
# ( 361 - 390 ) - номера строк результатов
#
# Параметры:
# $iCurPage - текущая страница
# $iLinesPP - кол-во результатов на странице
# $iReturned - кол-во результатов всего
# $iShowNums - сколько номеров страниц показывать вперёд и назад
# $bIsDesc - результаты в обратном порядке
# $bShowResNums - показывать номера строк результатов "(с ... по ...)"
# $sQueryString - дополнительные параметры строки запроса (если надо)
#
# Выходные данные:
# массив (строка со ссылками, номер первой записи на текущей странице)
################################################ 

function SetRangePicker( $iCurPage, $iLinesPP, $iReturned, $iShowNums, $bIsDesc, $bShowResNums, $sQueryString )
{
   if ( $iReturned > 0 ) 
    {
         $iTotalPages = $iReturned/$iLinesPP;
         if ($iTotalPages != (int)$iTotalPages)
         {
          if($iTotalPages > 1) $iTotalPages = (int)$iTotalPages + 1;
           else $iTotalPages = 1;
         }
				 if($iTotalPages == 1) return array("", 0);
         // Определяем начальную страницу
         if ( $iCurPage > $iShowNums )
           {
           		if($iCurPage - $iShowNums < 1) $iStartPage = 1;
           			else $iStartPage = $iCurPage - $iShowNums;
						} 
						else $iStartPage = 1;

         // Определяем конечную страницу
         if ( $iCurPage < 1 )
           {
           	 if($iTotalPages >= $iShowNums) $iStopPage = $iShowNums;
           			 else $iStopPage = $iTotalPages;
           }
					else 
           {
            		if($iTotalPages < $iCurPage + $iShowNums) $iStopPage = $iTotalPages;
            		else $iStopPage = $iCurPage + $iShowNums;
           }

         $sPicker = "<div class=\"pager\"><b>Страницы:</b>&nbsp; ";

         if ( $iStartPage > 1 )
         	{  
         		if ( $iStartPage > 1 ) $iJumpPage = ( $iStartPage - 1 );
               else  $iJumpPage = 1;
            $sPicker .= "<span><a href=\"?pn=".($iCurPage - $iShowNums - 1)."$sQueryString\">&lt;&lt;</a></span>&nbsp;";
         	}
         for($iPage = $iStartPage; $iPage <= $iStopPage; $iPage++)
          {
          	$sPicker .= "<span>"; 
            if ( $iPage != $iCurPage ) $sPicker .= "<a href=\"?pn=$iPage$sQueryString\">";
            $sPicker .= "<b>".$iPage."</b>";
            if ( $iPage != $iCurPage ) $sPicker .= "</a>";
            $sPicker .= " </span>&nbsp;";
          }

         if ( $iStopPage < $iTotalPages )
         {
            if ( $iStopPage + 1 > $iTotalPages ) $iJumpPage = $iTotalPages;
              else $iJumpPage = $iStopPage+1;         
            $sPicker .= "<span><a href=\"?pn=".($iCurPage + $iShowNums + 1)."$sQueryString\">&gt;&gt;</a></span>";
         }

				 //определяем номера строк результатов
         $iLow  = 1 + (($iCurPage-1)*$iLinesPP);
         $iHigh = ($iLow + ($iLinesPP - 1));     
         if ( $iHigh > $iReturned ) $iHigh = $iReturned;
   			 
   			 if($bShowResNums)
   			 {
   			 	if($bIsDesc) $sPicker .= " &nbsp;<b>( строки с ".($iReturned - $iLow)." по ".($iReturned - $iHigh)." )</b>";
   			 		else $sPicker .= " &nbsp;<b>( строки с ".$iLow." по ".$iHigh." )</b>";
   			 }
   			 $sPicker .= "</div>";
    }
    else {
    	$sPicker = "";
    	$iLow = 1;
    }
    
 return array($sPicker, ($iLow - 1) ); 
}
Как-то так...
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Огого :blink:
Код:
define('POST_LIMIT', 10);
$page = (isset($_GET['page']) && is_numeric($_GET['page']))?$_GET['page']:1;

$query = mysql_query('SELECT id,title FROM articles LIMIT '.($page-1)*POST_LIMIT.', '.POST_LIMIT);
$count = mysql_result(mysql_query('SELECT COUNT(*) FROM articles'));
while($row = mysql_fetch_assoc($query)){
    echo '<li><a href="articles.php?read&id='.$row['id'].'">'.$row['title'].'</a></li>'; 
}
echo '<ul class="pager">';
$triple = false;
for($i=1; $i<=$count; $i++){
    if(abs($self->page-$i)<=1 || $i<=1 || $i>=($count)){
        $triple = false;
        echo '<li><a href="articles.php?page='.$i.'" title=""'.($self->page==$i?' class="active"':'').'>'.$i.'</a></li>';
    } elseif(!$triple) {
        $triple = true;
        echo '<li>…</li>';
    }
}
echo '</ul>';
В итоге получаем список страниц вроде 1..4,5,6..12 или 1,2,3...12 или 1...10,11,12
 
Статус
Закрыто для дальнейших ответов.
Верх Низ