За последние 24 часа нас посетили 54053 программиста и 1721 робот. Сейчас ищут 808 программистов ...

Постраничная навигация, нужна помощь в доработке.

Тема в разделе "PHP для новичков", создана пользователем Vovec800, 16 июн 2011.

  1. Vovec800

    Vovec800 Активный пользователь

    С нами с:
    7 ноя 2010
    Сообщения:
    6
    Симпатии:
    0
    Данный код выводит все номера страниц из БД в виде ссылок, но как реализовать навигацию типа ( предыдущая [номер страницы] следующая ) , пока не разобрался. Если кому не сложно подскажите пожалуйста.
    PHP:
    1. <?php
    2. // имя этого файла mysql.php //
    3. require_once "config.php";
    4. $idSQLConnection = mysql_connect($config['mysqlhost'], $config['mysqluser'], $config['mysqlpass']);
    5. if ( !$idSQLConnection );
    6. $result = mysql_select_db( $config['mysqldb'], $idSQLConnection );
    7. $order = isset($_REQUEST["order"]) ? $_REQUEST["order"] : "ID";
    8. while ($result2 && $field2 = mysql_fetch_assoc($result2)){};
    9. $result = mysql_query("SELECT films.* , sum(Size) as SSize FROM films LEFT JOIN files ON(films.ID=files.FilmID) WHERE hide=0 GROUP BY films.ID ORDER BY $order $dir");
    10. echo "<table border='0'>"
    11.     ." ";
    12. while ($field=mysql_fetch_assoc($result))
    13. {  
    14.  echo " "
    15.     ."<a href='{$config['siteurl']}/#film:{$field['ID']}:1:0'>".$field["ID"]."";
    16. };
    17. ?>
    18.  
    В index.php
    PHP:
    1. {
    2.                     template += "<?php require_once "mysql.php"; ?><span style='margin-left:3em;' id='backbox'><a href='#film:"+film.ID+":1:0'>Текущая страница:["+film.ID+"]</a></span>";
    3.                    
    4.                     }
    5.  
     
  2. gagagogo

    gagagogo Активный пользователь

    С нами с:
    22 июн 2009
    Сообщения:
    2
    Симпатии:
    0
    Код (Text):
    1.  
    2. $currentPage   = 0; //текущая страница
    3. $itemsPerPage = 30; //позиций на станицу
    4.  
    5. $itemsAll = 0;    // сколько всего позиций
    6.  
    7. $currentPage = intval($_GET['page']);
    8.  
    9. $result = mysql_query("SELECT count(*) itemsAll FROM films LEFT JOIN files ON(films.ID=files.FilmID) WHERE hide=0 GROUP BY films.ID");
    10. $row = mysql_fetch_array($result);
    11. $itemsAll = $row['itemsAll'];
    12.  
    13. $pages = ceil($itemsAll/$itemsPerPage); // считаем сколько всего страниц получилось
    14.  
    15. if($currentPage >= $pages-1)
    16.     $currentPage = $pages-1;
    17.  
    18. $offset = $currentPage * $itemsPerPage;
    19.  
    20. $query = "SELECT films.* , sum(Size) as SSize FROM films LEFT JOIN files ON(films.ID=files.FilmID) WHERE hide=0 GROUP BY films.ID ORDER BY $order $dir";
    21. $query.= " limit {$offset},{$itemsPerPage}";
    22.  
    23. $result = mysql_query($query);
    24.  
    25. while ($field=mysql_fetch_assoc($result))
    26. {
    27.     echo "\n<a href='{$config['siteurl']}/#film:{$field['ID']}:1:0'>".$field["ID"].""; //тут похоже тэг закрыть надо, но как есть отставлю
    28. }
    29.  
    30. $prev = $currentPage - 1;
    31. if($prev<0) $prev = 0;
    32.  
    33. $next = $currentPage+1;
    34. if($next>$pages-1)$next = $pages - 1;
    35.  
    36. echo "<a href='?page={$prev}'>предыдущая</a>
    37.       текущая: {$currentPage}
    38.       <a href='?page={$prev}'>следующая</a>";
    так вот как то....
     
  3. Vovec800

    Vovec800 Активный пользователь

    С нами с:
    7 ноя 2010
    Сообщения:
    6
    Симпатии:
    0
    Спасибо, буду додумывать )
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Может, пригодится.
    Файл pager.php
    PHP:
    1. <?php
    2. /**
    3.  * pager.php
    4.  * Клас для генерации ссылок на другие страницы
    5.  * @author Sandro
    6.  */
    7. class Pager{
    8.     /**
    9.      * @var int Общее количество элементов.
    10.      */
    11.     public $records_count=0;
    12.     /**
    13.      * @var int Количество элементов на страницу.
    14.      */
    15.     public $numrows=10;
    16.     private $page=0;
    17.     /**
    18.      * @var array Массив параметров из глоб. массива $_GET.
    19.      */
    20.     public $get=array();
    21.     /**
    22.      * Шаблоны к пунктам
    23.      * @var array (a=>шаблон для ссылок, b=>шаблон для текущей страницы,points=>шаблон для многоточия)
    24.      */
    25.     public $template=array(
    26.         'a'=>'<span><a href="%1$s">[%2$s]</a></span>',
    27.         'b'=>'<span><b>%s</b></span>',
    28.         'points'=>'<span>%s</span>'
    29.     );
    30.     /**
    31.      * Слова Назад и Вперед
    32.      * @var array ('prev'=>назад, 'next'=>вперед)
    33.      */
    34.     public $words=array('prev'=>'prev','next'=>'next','pages'=>'pages');
    35.     /**
    36.      * @var array Все пункты для вывода.
    37.      */
    38.     private $outArr=array();
    39.  
    40.  
    41.     private function GetPageLink($get){
    42.         $link='';
    43.         $first=true;
    44.         foreach($get as $name=>$value){
    45.             if($first){
    46.                 $link='?';
    47.                 $first=false;
    48.             }else{
    49.                 $link.='&';
    50.             }
    51.             $link.=$name.'='.$value;
    52.         }
    53.         return $link;
    54.     }
    55.  
    56.  
    57.     public function GetPageList(){
    58.         $this->outArr[]=sprintf('%s:', $this->words['pages']);
    59.         $maxpage=ceil($this->records_count/$this->numrows);
    60.         if($maxpage>1){
    61.             $page_from=$this->page-4;
    62.             if($maxpage-$this->page<5){$page_from=$maxpage-10;}
    63.             if($page_from<0){$page_from=0;}
    64.             $page_to=$page_from+10;
    65.             if($page_to>$maxpage){$page_to=$maxpage;}
    66.  
    67.             if($this->page!=0){
    68.                 $this->get['page']=$this->page-1;
    69.                 $link = $this->GetPageLink($this->get);
    70.                 $this->outArr[]=sprintf($this->template['a'],$link,$this->words['prev']);
    71.             }
    72.  
    73.             if($page_from>0){
    74.                 $this->get['page']=0;
    75.                 $link=$this->GetPageLink($this->get);
    76.                 $this->outArr[]=sprintf($this->template['a'],$link,1);
    77.                 $this->outArr[]=sprintf($this->template['points'],'...');
    78.             }
    79.  
    80.             for($i = $page_from; $i<$page_to; $i++){
    81.                 if($this->page==$i){
    82.                     $this->outArr[]=sprintf($this->template['b'],$i+1);
    83.                 }else{
    84.                     $this->get['page'] = $i;
    85.                     $link = $this->GetPageLink($this->get);
    86.                     $this->outArr[]=sprintf($this->template['a'],$link,$i+1);
    87.                 }
    88.             }
    89.  
    90.             if(($page_to)< $maxpage){
    91.                 $this->get['page']=$maxpage-1;
    92.                 $link=$this->GetPageLink($this->get);
    93.                 // if($page_to != $maxpage-1)
    94.                 {
    95.                     $this->outArr[]=sprintf($this->template['points'],'...');
    96.                 }
    97.                 $this->outArr[]=sprintf($this->template['a'],$link,$maxpage);
    98.             }
    99.  
    100.             if(($this->page+1)!=$maxpage){
    101.                 $this->get['page']=$this->page+1;
    102.                 $link=$this->GetPageLink($this->get);
    103.                 $this->outArr[]=sprintf($this->template['a'],$link,$this->words['next']);
    104.             }
    105.  
    106.         }else{
    107.             $this->outArr=array();
    108.         }
    109.  
    110.         return implode('',$this->outArr);
    111.     }
    112.  
    113.     /**
    114.      * @param int $page
    115.      */
    116.     function __construct($page=-1){
    117.         if($page>=0){$this->page=$page;}
    118.         $this->get=$_GET;
    119.     }
    120. }
    121. ?>
    Использовать:
    PHP:
    1. <?php
    2. include_once 'pager.php';
    3. $page=1;//текущая страница, можно взять, например, из $_GET массива:
    4. $page=(int)$_GET['page'];
    5. $pager=new Pager($page);//создаём объект
    6. $c=100;//всего записей (взять из БД через COUNT())
    7. $pager->records_count=$c;
    8. $numrows=10;//количество записей на страницу
    9. $pager->numrows=$numrows;
    10. $pager->words=array('prev'=>'сюда','next'=>'туда','pages'=>'Страницы');//локализация, если нужна
    11. //вывод на странице, или лучше запомнить в переменную
    12. echo '<div class="pager">'.$pager->GetPageList().'</div>';
    13.  
    14. //выборка из базы, как выше предложено
    15. $offset = $page * $numrows;
    16. $query = "SELECT films.* , sum(Size) as SSize FROM films LEFT JOIN files ON(films.ID=files.FilmID) WHERE hide=0 GROUP BY films.ID ORDER BY $order $dir";
    17. $query.= " LIMIT {$offset},{$numrows}";
    18. ?>