Войти

Показать полную графическую версию : постраничный вывод


chem1
16-01-2004, 10:52
PHP + SQL
Хотелось бы чтобы на страницу из базы выводилось по 50 позиций, на следующую еще 50 и т.д.

advocat
16-01-2004, 11:27
А в чем собственно проблема ... пишем
<?
$countres = mysql_query("SELECT COUNT(*) as `count` FROM `".$tbl_name."` WHERE 1");
$count = mysql_result($countres,"count");

$limit = 50; /* кол-во записей*/
$nowpage = $_GET[p]; /* текущая страница */

if ($count > $limit) {
* *$start = ($nowpage * $limit) - $limit;
* *$minus = ($count % $limit);
* *if ($minus == 0) {
* * *$countpage = ($count / $limit);
* *} else {
* * *$countpage = (($count - $minus) / $limit) + 1;
* *}
*} else {
* *$countpage = 1;
* *$start = 0;
*}

//запрос к БД с лимитом записей
mysql_query("SELECT COUNT(*) as `count` FROM `".$tbl_name."` WHERE 1 LIMIT ".$start.",",$limit);

?>

Думаю вывод страниц сам сделаешь :)

Prisoner
16-01-2004, 12:57
Кроме вышеприведенного кода постарничный вывод очень популярен у скриптописателей и скриптов реализующих эту феньку довольно много в Сети, поиск вам поможет.

vadimiron
16-01-2004, 15:30
а я когда себе постраничный вывод делал, решил малость поизвращаться и, чтобы определить сколько у меня будет страниц, использовал функцию bcdiv с параметром 0, то есть

$a=bcdiv($n,$m,0); функция деления двух чисел, а третий переметр, сколько знаков после запятой

$n-записей в  базе, $m-сколько записей выводить на страницу

а если $a будет с остатком, то количество страниц равно $a+1

:) :) :)

Конечно не проще, зато интересней

А вообще математические функции бывают очень полезны, хотя многие уделяют им не достаточно внимания

Prisoner
16-01-2004, 22:46
Можно так еще... реализовать класс меню -

<?
 define('PART1_LENGTH', 10);
 define('PART2_LENGTH', 3);
 define('PART3_LENGTH', 2);
 define('FULL_LENGTH', 37);

class Navigation
 {

  var $ParamName;      /* имя параметра строки адреса с инфой о меню*/
  var $FileName;       /* куда, собственно, меню будет строить ссылки*/
  var $Delimiter;      /* символ-разделитель пунктов*/
  var $DelimiterClass; /* имя стиля для символа-разделителя*/
  var $CurPage;        /* номер активной паги */
  var $Total;          /* общее число элементов */
  var $AClass;         /* имя стиля для ссылки*/
  var $NAClass;        /* имя стиля не для ссылки*/
  var $ColPerStr;      /* количество столбцов на строку при выводе номеров страниц*/

  function Info()
    {
     echo "<br>Class info:<br> CurPage: ".$this->CurPage."<br> Total: ".$this->Total."<br> ParamName: ".$this->ParamName."<br> FileName: ".$this->FileName."<br> Delimiter: ".$this->Delimiter."<br> AClass: ".$this->AClass."<br> NAClass: ".$this->NAClass."<br> DelimiterClass: ".$this->DelimiterClass."<br>";
    }

  function Init()
    {
     if (isset($_GET[$this->ParamName]))
       {
        $Str = substr($_GET[$this->ParamName], PART1_LENGTH);
       }
     else
       {
       $Str='';
       }

     if (!trim($Str))
       {
        $this->CurPage = $this->Total = 0;
        return false;
       }

     @list($CurPage, $Total) = preg_split('/[^0-9]/si', $Str, 3, PREG_SPLIT_NO_EMPTY);
     $this->CurPage = abs(intval($CurPage));
     $this->Total = abs(intval($Total));

     if ($this->Total<$this->CurPage)
       $this->CurPage=$this->Total;
    }

  function MakeSecureParam($CurIndex, $Total)
    {
     srand(time());
     $Part1 = substr(md5(uniqid(mt_rand())), 0, PART1_LENGTH);

     srand(time());
     $T_Str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
     $Part2 = substr($T_Str, 0, PART2_LENGTH);

     srand(time());
     $T_Str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
     $Part3 = substr($T_Str, 0, PART3_LENGTH);

     srand(time());
     return str_pad($Part1.$CurIndex.$Part2.$Total.$Part3,
                    FULL_LENGTH,
                    md5(uniqid(mt_rand())),
                    STR_PAD_RIGHT );
    }

  function ShowMenu()
    {
     if (strpos($this->FileName, "?")===false)
       $ParamDelimiter='?';
     else
       $ParamDelimiter='&';

     echo '<table cellpadding=3 cellspacing=0 border=0><tr>';

     $ColCnt = 0;

     for ($I=1;$I<=$this->Total;$I++)
       {
        if ($ColCnt<=$this->ColPerStr)
          {
           echo '<td>';
           $ColCnt++;
          }
        else
          {
           echo '</tr><tr><td>';
           $ColCnt = 0;
          }


        if ($I==$this->CurPage)
          {
           if (Trim($this->NAClass))
             echo "<span class=\"".Trim($this->NAClass)."\">".$I."</span>\n";
           else
             echo $I;

           if ($I<$this->Total)
             echo $this->Delimiter;
          }
        else
          {
           if (Trim($this->AClass))
             echo "<a class=\"".Trim($this->AClass)."\" href=\"".$this->FileName.$ParamDelimiter.$this->ParamName."=".$this->MakeSecureParam($I,$this->Total)."\">".$I."</a>\n";
           else
             echo "<a href=\"".$this->FileName."?".$this->ParamName."=".$this->MakeSecureParam($I,$this->Total)."\">".$I."</a>\n";
           if ($I<$this->Total)
             echo $this->Delimiter;
          }

        echo '</td>';
       }

     echo '</tr><tr><td align=center colspan='.$this->ColPerStr.'>';

     if ($this->CurPage>1)
       echo "<a class=\"".$this->AClass."\" href=\"".$this->FileName.$ParamDelimiter.$this->ParamName."=".$this->MakeSecureParam(($this->CurPage-1),$this->Total)."\">назад</a>".$this->Delimiter;
     else
       echo " <span class=\"".$this->NAClass."\">назад</span>".$this->Delimiter;
     if ($this->CurPage<$this->Total)
       echo " <a class=\"".$this->AClass."\" href=\"".$this->FileName.$ParamDelimiter.$this->ParamName."=".$this->MakeSecureParam(($this->CurPage+1),$this->Total)."\">вперед</a>";
     else
       echo " <span class=\"".$this->NAClass."\">вперед</span>";

     echo '</td></tr>';
     echo '<tr><td align=center colspan='.$this->ColPerStr.'>';
     echo " <a class=\"".$this->AClass."\" href=\"".$this->FileName.$ParamDelimiter.'full=1'."\">все страницы</a>";
     echo '</td></tr></table>';
    }

 function Navigation($ParamName, $FileName, $Delimiter, $AClass, $NAClass, $DelimiterClass, $ColPerStr)
    {
     $this->CurPage        = $this->Total = 0;
     $this->ParamName      = $ParamName;
     $this->FileName       = $FileName;
     $this->Delimiter      = $Delimiter;
     $this->AClass         = $AClass;
     $this->NAClass        = $NAClass;
     $this->DelimiterClass = $DelimiterClass;
     $this->ColPerStr      = $ColPerStr;
    }
 }
?>


Скажем выборка из БД (здесь это MySql) производится НЕ по лимиту (см. LIMIT). Создаем экземпляр класса и инициализируем его:

$Result = mysql_query ('какой-то запрос');
 $StringsNum = mysql_num_rows($Result)
//инициализация страничной системы
    $NavMenu = new Navigation('nav', 'index.php', ' ', 'navmenu', 'navmenu', '', 15);
// nav - имя параметра где от скрипта к скрипту будет хранится информация о текущей странице и их полного числа
// index.php - скрипт который будет участвовать в ссылках страниц
// 15 - число страниц в строке, остальные переносятся на новую
    $NavMenu->Init();
    if ($NavMenu->CurPage==0 && $NavMenu->Total==0)
      {
       $NavMenu->CurPage=1;
       // StringsPerPage - константа с числом записей на странице (= лимиту выборки)
       $NavMenu->Total=$NewsNum / StringsPerPage;
       if ($StringsNum % StringsPerPage!=0)
       $NavMenu->Total+=1;
      }
    $Page = $NavMenu->CurPage;


Теперь нам нужно организовать вывод:

   while ($Row = mysql_fetch_array($Result, MYSQL_NUM))
      {
       $Data[]=$Row;
      }
   // собственно вывод
   foreach (Range (($Page-1)*StringsPerPage, $Page*StringsPerPage-1) as $I)
       {
        if (isset($Data[$I]))
          {
             вывод в каком угодно виде
          }
       }
   //проверка надобности рисования менюшки страничной системы и отрисовка в каком надо виде
   if ($StringsNum>StringsPerPage)
      {
       echo "<br><center>";
       $NavMenu->ShowMenu();
       echo "</center>";
      }


вот... кажется нигде не ошибся...

Исправлено: Prisoner, 2:20 17-01-2004




© OSzone.net 2001-2012