За последние 24 часа нас посетили 17854 программиста и 1701 робот. Сейчас ищут 1639 программистов ...

Постраничный вывод результатов (он же пейджер)

Тема в разделе "PHP для новичков", создана пользователем 440Hz, 16 авг 2007.

  1. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Psih
    Тема и так приклеена выше некуда :)
     
  2. bupRoubtedo

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

    С нами с:
    2 авг 2009
    Сообщения:
    5
    Симпатии:
    0
    Адрес:
    Kyrgyzstan
    Ïîñòðàíè÷íûé âûâîä ðåçóëüòàòîâ îí æå ïåéäæåð

    äà ìîæíî óãàðíóòü)))!!!!
     
  3. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    тек-с. Вернемся к этому вопросу. Неужели не существует какого-либо решения для создания обратной нумерации страниц, что б элементы не перескакивали с одной на другую?
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    на русском попробуй описать.

    если ссылки с прямой нумерацией, а визуально показывать обратную - то в чем проблема?
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    [vs]
    он хочет, чтобы ссылка на 5-ю с конца страницу как получилась. так и не менялась. но как это описать в логике, да еще в вариантами удаления записей - пока я не увидел. )
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    armadillo
    Если новости - то можно выводить все за конкретную дату на одной странице. Если слишком редко доавбляются новые записи, то по неделям. В любом случае, если надо чтобы записи по страницам не смещались при удалении, одинаковое количество записей на страницу сохраняться не будет.
    Можно еще сделать сециальную таблицу pages, с двумя полями. Во второе через запятую перечислать номера записей для конкретной страницы.
     
  8. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    лучше — наоборот, в каждую запись номер страницы.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Стормозил ))
     
  10. botton

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

    С нами с:
    9 окт 2008
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Камчатский край
    маленький пример.. хотелось бы отметишь, что юрл не обязательно вводить, а можно выдирать и так..

    Код (Text):
    1.  
    2.  
    3. <table width="100%">
    4. <tr>
    5. <td class="pages-list">
    6. <?php
    7. $number = 1000; - количество элементов всего
    8. $pcount = 20 - количество жлементов на странице
    9. $pg_all=20; // только чётное количество (количество цифирок страничек)
    10.  
    11. $a=CEIL(($number-$pcount)/$pcount);
    12. //phpinfo();
    13. $bs= $HTTP_SERVER_VARS[QUERY_STRING];
    14. //проверка если ли в конце юрла переменная номера
    15. $i=strpos($bs,"&pg=");
    16. if ($i==0){$i=strlen($bs);}
    17. $bs=substr($bs,0,$i);
    18.  
    19.             $pag=0;
    20. $pg=$HTTP_GET_VARS['pg'];
    21. $c_pg=0;
    22. $ec='';
    23. if ($pg<=($pg_all/2)){
    24.     $pag=0;
    25.     if (($pag+$pg_all)<$a){$ec2='&nbsp;...&nbsp;<a href="?'.$bs.'&pg='.$a.'" >'.($a+1).'</a>';}
    26. }else{
    27.     $ec='<a href="?'.$bs.'&pg=0" >1</a>&nbsp;...&nbsp;';
    28.     $pag=$pg-$pg_all/2;
    29.    
    30.     if (($pag+$pg_all)<$a){$ec2='&nbsp;...&nbsp;<a href="?'.$bs.'&pg='.$a.'" >'.($a+1).'</a>';}
    31. }
    32.     WHILE (($pag <= $a)&&($c_pg<=$pg_all)){
    33.         $c_pg++;
    34.         $pag++;
    35.        
    36.             if ($number>=$pcount){
    37.                 if (($pag-1)==$HTTP_GET_VARS['pg']){$ec.= '<a class="curent">'.$pag.'</a>&nbsp;';
    38.                 }else{
    39.                     $ec.='<a href="?'.$bs.'&pg='.($pag-1).'" >'.$pag.'</a>&nbsp;';
    40.                 }
    41.             }
    42.     }
    43.  
    44.    
    45.    
    46.     echo $ec.$ec2;       
    47. ?>
    48.  
    49. </td>
    50. </tr>
    51. </table>
     
  11. Jekis

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

    С нами с:
    1 сен 2009
    Сообщения:
    14
    Симпатии:
    0
    Как зделать, чтобы при переходе на др. страницу менялась и графика, т.е изображения???
     
  12. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Изменять изображения при переходе на другую страницу.
     
  13. Jekis

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

    С нами с:
    1 сен 2009
    Сообщения:
    14
    Симпатии:
    0
    Подскажите как это осуществить?
     
  14. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Разруливайте, например, url'ом.
    Если у вас как идентификатор страницы в $_GET, скажем, id, то можно так

    PHP:
    1. <?php
    2. if($_GET['id'] == 'id')
    3.            $image = '<img src="/data/img.jpg" />';
    4. else
    5.            $image = '<img src="/data/img2.jpg" />';
     
  15. Jekis

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

    С нами с:
    1 сен 2009
    Сообщения:
    14
    Симпатии:
    0
    Мне вот как на этом сайте необходимо зделать, тут графика тоже меняется при переходе на страницы. (http://www.free-download-internet.com/)
     
  16. BMWSauber

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

    С нами с:
    21 ноя 2009
    Сообщения:
    151
    Симпатии:
    0
    Помогите новичку, совсем запутался с сабжем.

    проблема такая:

    из формы form.php посылаю значение переменных

    Код (Text):
    1. http://127.0.0.1/anex/pager.php?townfrom=Kiev&country=Turkiye&begin=&end=&nochimin=3&nochimax=14&adult=2&child=1&fbut=Go!
    и все работает нормально, получяю ссылки на свои N страниц, НО при переходе на страницу 2 адрес меняется на


    Код (Text):
    1. http://127.0.0.1/anex/pager.php?page=2
    и конечно ничего не работает. пишет "error! Записей не найдено!"

    предпологаю что ошибка в строке
    PHP:
    1. echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$page_link.'>'.$page_link.'</a> '.$sperator;

    а вот собственно и весь код
    PHP:
    1. <?php
    2. $nochimin=$_GET['nochimin'];
    3. $nochimax=$_GET['nochimax'];
    4. $country=$_GET['country'];
    5. $townfrom=$_GET['townfrom'];
    6. $adult=$_GET['adult'];
    7. $child=$_GET['child'];
    8. $pricefrom=$_GET['pricefrom'];
    9. $priceto=$_GET['priceto'];
    10. if ($pricefrom==""){$pricefrom=0;}
    11. if ($priceto==""){$priceto=1000000;}
    12.  
    13.  
    14. function universal_link_bar($page, $count, $pages_count, $show_link)
    15. {
    16. // $show_link - это количество отображаемых ссылок;
    17. // нагляднее будет, когда это число будет парное
    18. // Если страница всего одна, то вообще ничего не выводим
    19. if ($pages_count == 1) return false;
    20. $sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками
    21. // Для придания ссылкам стиля
    22. $style = 'style="color: #808000; text-decoration: none;"';
    23. $begin = $page - intval($show_link / 2);
    24. unset($show_dots); // На всякий случай :)
    25. // Сам постраничный вывод
    26. // Если количество отображ. ссылок больше кол. страниц
    27. if ($pages_count <= $show_link + 1) $show_dots = 'no';
    28. // Вывод ссылки на первую страницу
    29. if (($begin > 2) && !isset($show_dots) && ($pages_count - $show_link > 2)) {
    30. echo '<a '.$style.' href='.$_server['php_self'].'?page=1> |< </a> ';
    31. }
    32.  
    33. for ($j = 0; $j < $page; $j++) {
    34. // Если страница рядом с концом, то выводить ссылки перед идущих для того,
    35. // чтобы количество ссылок было постоянным
    36. if (($begin + $show_link - $j > $pages_count) && ($pages_count-$show_link + $j > 0)) {
    37. $page_link = $pages_count - $show_link + $j; // Номер страницы
    38. // Если три точки не выводились, то вывести
    39. if (!isset($show_dots) && ($pages_count-$show_link > 1)) {
    40. echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($page_link - 1).'><b>...</b></a> ';
    41. // Задаем любое значение для того, чтобы больше не выводить в начале "..." (три точки)
    42. $show_dots = "no";
    43. }
    44. // Вывод ссылки
    45. echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$page_link.'>'.$page_link.'</a> '.$sperator;
    46. } else continue;
    47. }
    48. for ($j = 0; $j <= $show_link; $j++) // Основный цикл вывода ссылок
    49. {
    50. $i = $begin + $j; // Номер ссылки
    51. // Если страница рядом с началом, то увеличить цикл для того,
    52. // чтобы количество ссылок было постоянным
    53. if ($i < 1) {
    54. $show_link++;
    55. continue;
    56. }
    57. // Подобное находится в верхнем цикле
    58. if (!isset($show_dots) && $begin > 1) {
    59. echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($i-1).'><b>...</b></a> ';
    60. $show_dots = "no";
    61. }
    62. // Номер ссылки перевалил за возможное количество страниц
    63. if ($i > $pages_count) break;
    64. if ($i == $page) {
    65. echo ' <a '.$style.' ><b>'.$i.'</b></a> ';
    66. } else {
    67. echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$i.'>'.$i.'</a> ';
    68. }
    69. // Если номер ссылки не равен кол. страниц и это не последняя ссылка
    70. if (($i != $pages_count) && ($j != $show_link)) echo $sperator;
    71. // Вывод "..." в конце
    72. if (($j == $show_link) && ($i < $pages_count)) {
    73. echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($i+1).'><b>...</b></a> ';
    74. }
    75. }
    76. // Вывод ссылки на последнюю страницу
    77. if ($begin + $show_link + 1 < $pages_count) {
    78. echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$pages_count.'> >| </a>';
    79. }
    80. return true;
    81. } // Конец функции
    82.  
    83. // Подключение к базе данных
    84. mysql_connect('localhost', 'root', '') or die('error! Нет соединения с сервером mysql!');
    85. mysql_select_db('argus') or die('error! Нет соединения с базой данных!');
    86.  
    87. // Подготовка к постраничному выводу
    88. $perpage = 10; // Количество отображаемых данных из БД
    89. if (empty($_get['page']) || ($_get['page'] <= 0)) {
    90. $page = 1;
    91. } else {
    92. $page = (int) $_get['page']; // Считывание текущей страницы
    93. }
    94. // Общее количество информации
    95. $count = mysql_numrows(mysql_query("SELECT * FROM `t1` WHERE `townfrom` = \"$townfrom\" AND `country` = \"$country\" AND `nochi` >= \"$nochimin\" AND `nochi` <= \"$nochimax\" AND `vzr` = \"$adult\" AND `deti` = \"$child\" AND `price` >= \"$pricefrom\" AND `price` <= \"$priceto\"")) or die('error! Записей не найдено!');
    96. $pages_count = ceil($count / $perpage); // Количество страниц
    97. // Если номер страницы оказался больше количества страниц
    98. if ($page > $pages_count) $page = $pages_count;
    99. $start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД
    100. // Вызов функции, для вывода ссылок на экран
    101.  
    102. universal_link_bar($page, $count, $pages_count, 10);
    103.  
    104. // Вывод информации из базы данных
    105. echo '<p><b>Постраничный вывод информации</b></p>';
    106. $result = mysql_query("select * from t1 WHERE `townfrom` = \"$townfrom\" AND `country` = \"$country\" AND `nochi` >= \"$nochimin\" AND `nochi` <= \"$nochimax\" AND `vzr` = \"$adult\" AND `deti` = \"$child\" AND `price` >= \"$pricefrom\" AND `price` <= \"$priceto\" limit ".$start_pos.", ".$perpage) or die('error!');
    107. while ($row = mysql_fetch_array($result)) {
    108. echo '<p>'.$row['price'].'</p>';
    109. }
    110. ?>
     
  17. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Ну какая ошибка? Эта строка написана так, чтобы формировать ссылку вида
    Код (Text):
    1. http://127.0.0.1/anex/pager.php?page=2
    . Если ссылка тебе не подходит, формируй другую. Если кроме $_GET['page'] тебе нужна еще чертова уйма параметров, то пихай их в эту ссылку сам, больше они ниоткуда не возьмутся. Не в сессии же их хранить.
     
  18. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    вот всегда интересно что в таких классах расположено?разнообразные часто используемые методы? или что
     
  19. mpak

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

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    За одно и я свой выложу. Может что то новое будет

    function mpager($count, $cur=null, $url=null){
    if ($cur === null) $cur = $_GET['p'];
    if ($url === null) $url = strtr($_SERVER['REQUEST_URI'], array("/p:{$_GET['p']}"=>'', "&p={$_GET['p']}"=>''));
    if(2 > $count = ceil($count)) return;
    echo "<div class=\"pager\">". ($cur <= 0 ? "<span>← назад</span>" : "<a href=\"$url".($cur > 1 ? "/p:".($cur-1) : '')."\">← назад</a>");
    for($i = max(0, min($cur-10, $count-20)); $i < min($count, max($cur+10, 20)); $i++)
    echo '&nbsp;'. ($i == $cur ? "<span>".($i+1)."</span>" : "<a href=\"$url".($i ? (strpos($url, '&') || strpos($url, '?') ? "&p=$i" : "/p:$i") : '')."\">".($i+1)."</a>");
    echo '&nbsp;';
    echo $cur+1 >= $count ? "<span>вперед →</span>" : "<a href=\"$url".($i ? (strpos($url, '&') || strpos($url, '?') ? "&p=".($cur+1) : "/p:".($cur+1)) : '')."\">вперед →</a>";
    echo "</div>";
    }

    Выборка из базы данных

    mpql(mpqw("SELECT SQL_CALC_FOUND_ROWS * LIMIT ". ((int)$_GET['p']*5). ",5");
    $conf['tpl']['pcount'] = mpql(mpqw("SELECT FOUND_ROWS()/5 AS count"), 0, 'count');

    Вывод в шаблоне.

    <div align=center><? mpager($conf['tpl']['pcount']); ?></div>

    Рабочий модуль вывод новостей на моем сайте: ftp://mpak.su/modules/news/

    Стоит только пояснить что параметры передаются в движок таким образом /param:value/param2:value2/param3:value3
    И пагер всегда дописывает к этой конструкции /p:num_page
     
  20. phpdude

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

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    у меня пейджер не простой :(

    разделен на бд пейджер - билдер запросови на вьюху от него - ну и там уже адаптеры могут делать форматирование выывода.

    кидану только бд листалку :)

    PHP:
    1. <?php
    2. class DB_Paged
    3. {
    4.     protected $sql;
    5.     protected $sqlTpl;
    6.  
    7.     protected $count;
    8.     protected $countSql;
    9.     protected $countSqlTpl;
    10.  
    11.     protected $pageName;
    12.     protected $page;
    13.     protected $perPage;
    14.  
    15.     /**
    16.      * Database module
    17.      * @var Db Database module object
    18.      */
    19.     protected $db;
    20.  
    21.     function __construct(DB $db, $sql, $key = '*', $perPage = 25, $pageName = 'page')
    22.     {
    23.         $this->db = $db;
    24.         $this->sqlTpl = $sql;
    25.         $this->countSqlTpl = $this->buildCountSql();
    26.  
    27.         $this->setPageName($pageName);
    28.         $this->setPerPage($perPage);
    29.     }
    30.  
    31.     public function buildCountSql($key = '*')
    32.     {
    33.         $sql = $this->sqlTpl;
    34.  
    35.         if(preg_match("#select.*?(distinctrow|distinct).*?from#ism", $sql, $distinct))
    36.         {
    37.             $key = strtoupper($distinct[1])." ".$this->db->escape($key);
    38.         }
    39.         else
    40.         {
    41.             $key = $this->db->escape($key);
    42.         }
    43.  
    44.         $countSql = "SELECT COUNT(".$key.") `count` ";
    45.  
    46.         $regex = "(?:\sHAVING\s|\sORDER\s|\sLIMIT\s|\sPROCEDURE\s|\sINTO\s|\sFOR\s+UPDATE\s|$)";
    47.         preg_match("#(FROM.*?)$regex#ism", $sql, $sqlInner);
    48.         $countSql .= $sqlInner[1];
    49.  
    50.         return $countSql;
    51.     }
    52.  
    53.     public function execute()
    54.     {
    55.         $vars = func_get_args();
    56.         $cback = array($this->db,"buildSql");
    57.  
    58.         $this->sql = call_user_func_array($cback,array_merge((array)$this->sqlTpl, $vars));
    59.         $this->countSql = call_user_func_array($cback,array_merge((array)$this->countSqlTpl, $vars));
    60.  
    61.         $this->count = $this->db->scalar($this->countSql);
    62.  
    63.         $from = $this->perPage * ($this->page - 1);
    64.  
    65.         $this->sql .= " LIMIT ".$from.", ".$this->perPage;
    66.  
    67.         return $this->db->sql2arr($this->sql);
    68.     }
    69.  
    70.     public function setPageName($pageName)
    71.     {
    72.         $this->pageName = $pageName;
    73.  
    74.         $page = (int)$_GET[$this->pageName];
    75.         $this->page = $page > 0 ? $page : 1;
    76.     }
    77.  
    78.     public function getPageName()
    79.     {
    80.         return $this->pageName;
    81.     }
    82.  
    83.     public function getSql()
    84.     {
    85.         return $this->sql;
    86.     }
    87.  
    88.     public function getSqlTpl()
    89.     {
    90.         return $this->sqlTpl;
    91.     }
    92.  
    93.     public function getCountSql()
    94.     {
    95.         return $this->countSql;
    96.     }
    97.  
    98.     public function setCountSqlTpl($countSqlTpl)
    99.     {
    100.         $this->countSqlTpl = $countSqlTpl;
    101.     }
    102.  
    103.     public function getCountSqlTpl()
    104.     {
    105.         return $this->countSqlTpl;
    106.     }
    107.  
    108.     public function getCount()
    109.     {
    110.         return $this->count;
    111.     }
    112.  
    113.     public function setPerPage($perPage = false)
    114.     {
    115.         if(!(int) $perPage)
    116.         {
    117.             $perPage = App::instance()->config->get("module.db.pager", 25);
    118.         }
    119.  
    120.         $this->perPage = $perPage;
    121.     }
    122.  
    123.     public function setPage($page)
    124.     {
    125.         $this->page = (int)$page > 0 ? (int)$page : 1;
    126.     }
    127. }
     
  21. phpdude

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

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    как-бы классец сам биснуется, парсит скл запросик простым методом, так как у меня параметризация в скл запросах, то там стоп слова не попадутся, поэтому 100% рабочий метод для не особо хитро-выебаных запросов.

    работает на ура, я забыл что такое писать гавенный запрос с "оборванными" "select ... "from кусками или лепить неудачные конструкции

    ктонить может заюзать просто часть которая над скл работает и юзать у себя :)
     
  22. phpdude

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

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    пример использования -

    PHP:
    1. <?php
    2.     public function getItems() {
    3.         global $sqlFilter;
    4.         $where = join(" AND ", $sqlFilter);
    5.         return $this->getPager("SELECT * FROM `#__service_orders` WHERE $where ORDER BY `id` DESC")->getData()->getItems();
    6.     }
    7.  
    8.     protected function getPager($sql) {
    9.         $this->pager = App::createModule("pager", $sql);
    10.  
    11.         return $this->pager;
    12.     }
    13.  
    PHP:
    1. require_once dirname(__FILE__).'/libs/DudePager.class.php';
    2. require_once dirname(__FILE__).'/classes/Pager.class.php';
    3.  
    4. Pager::setConfig($config);
    5.  
    6. return array("Pager", "create");
     
  23. phpdude

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

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    с легкостью жрет более сложные запросы

    PHP:
    1.     public function getItems() {
    2.         return $this->getPager("SELECT `m`.*, `o`.`title` `office` FROM `#__service_managers` `m`
    3.            LEFT JOIN `#__service_offices` `o` ON `o`.`id`=`m`.`office_id`")->getData()->getItems();
    4.     }
    5.  
    PHP:
    1. $pager = new Pager("SELECT
    2.                 `o`.*,
    3.                 `f`.`title` `office_title`,
    4.                 `m`.`fio` `master_title`
    5.             FROM `#__service_orders` `o`
    6.             LEFT JOIN `#__service_offices` `f` ON `f`.`id` = `o`.`office_id`
    7.             LEFT JOIN `#__service_masters` `m` ON `m`.`id` = `o`.`master_id`
    8.             WHERE $where ORDER BY `o`.`id` DESC");
    9.  
    10. $tpl->items = $pager->getData()->getItems();
     
  24. phpdude

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

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    долепите кто нить в парсер пхп плз аля

    PHP:
    1.  
    2. <?
    3. if(!strpos($code, "<?")) $code = "<?php\n".$code;
    4.  
     
  25. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    пашет на 5,3 ?