Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   постраничный вывод (http://forum.oszone.net/showthread.php?t=31373)

chem1 16-01-2004 10:52 214953

PHP + SQL
Хотелось бы чтобы на страницу из базы выводилось по 50 позиций, на следующую еще 50 и т.д.

advocat 16-01-2004 11:27 214954

А в чем собственно проблема ... пишем
Код:

<?
$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 214955

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

vadimiron 16-01-2004 15:30 214956

а я когда себе постраничный вывод делал, решил малость поизвращаться и, чтобы определить сколько у меня будет страниц, использовал функцию bcdiv с параметром 0, то есть

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

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

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

:) :) :)

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

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

Prisoner 16-01-2004 22:46 214957

Можно так еще... реализовать класс меню -
Код:

<?
  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>";
       }

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

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


Время: 02:59.

Время: 02:59.
© OSzone.net 2001-