Как сделать пагинацию на php?

Подскажите, пожалуйста, как сделать на PHP постраничную навигацию (или как ее еще называют пагинацию)? Если можно, подскажите, алгоритм действий.

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
$limit = 10; // Количество записей на странице


Запрос на получение числа записей получаю запросом MySQL:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }
SELECT COUNT(id) FROM users


Количество всех страниц считаю по формуле:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
Количество всех записей в таблице / На количество записей на странице
    $total = $result/$limit;


А какие мои дальнейшие действия? Заранее благодарен всем за подробные ответы!

1 ответов


Очень упрощенно и без необходимых проверок:
Дальше выводите пользователей постранично:
1. Определяете текущую страницу.

$page = $_GET['page']-1;2. Текущую страницу-1 умножаете на ваш limit
$start = $page*$limit;3. Так вы получите стартовую позицию
4. Дальше делаете выборку
SELECT * FROM users LIMIT $start, $limit*выбираем $limit записей начиная с позиции $start

Можете почитать еще тут: http://www.phpfaq.ru/paginator .

Почти получилось, но есть одна проблема:

Пагинация выводится, как положено, но у меня на каждой странице выводятся только первые пять записей(( и я не могу найти в чем ошибка, может Вы сможете мне помочь, очень буду Вам благодарен.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="uft-8">
    <title>Список зарегистрированных пользователей</title>
    <link href="css/admstyle.css" rel="stylesheet" type="text/css">
    <!--[if (gte IE 5.5)&(lte IE 8)]>
      <script type="text/javascript" src="js/DOMAssistantCompressed-2.8.1.js"></script>
      <script type="text/javascript" src="js/selectivizr-min.js"></script>
    <![endif]-->
  </head>
  <body>
    <?php
      //инициализирум механизм сесссий
      session_start();
      echo (session_id()); #отладка
      echo("<br>");
     
      //Присваиваем константы
      define(DB_NAME, "askdev");
      define(DB_USER, "root");
      define(DB_PASS, "root");
      define(DB_HOST, "localhost");
     
      $conn = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
      mysql_select_db(DB_NAME) or die(mysql_error());
//Вывод пагинации
     
      // количество записей, выводимых на странице
      $per_page=5;
     
      // получаем номер страницы
      if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
     
      // вычисляем первый оператор для LIMIT
      $start = abs($page*$per_page);
     
      // составляем запрос и выводим записи
      // переменную $start используем, как нумератор записей.
      echo("\t<h1 align=\"center\">Список зарегистрированных пользователей</h1>\n");
      echo("\t<table>\n");
      echo("\t\t<tr>\n\t\t<th>№</th><th>Логин</th><th>Email</th><th>Хэш Пароля</th>\n\t\t</tr>");
     
      $sql = "SELECT id, username, email, password FROM users LIMIT $start,$per_page";
      $result = mysql_unbuffered_query($sql) or die(mysql_error());
      while($row = mysql_fetch_array($result))
      {
        echo("\t\t<tr>\n");
        echo("\t\t<td>\n".$row['id']."</td><td>\n".$row['username']."</td><td>\n".$row['email']."</td><td>\n".$row['password']."</td>\n");
        echo("\t\t</tr>\n");
      }
     
      echo("\t</table>\n<br>\n");
     
      // дальше выводим ссылки на страницы:
      $query = "SELECT count(*) FROM users";
      $result = mysql_unbuffered_query($query) or die(mysql_error());
      $row = mysql_fetch_row($result);
      $total_rows = $row[0];
     
      $num_pages = ceil($total_rows/$per_page);
     
      for($i=1;$i<=$num_pages;$i++)
      {
        echo '<a href="'.$_SERVER['PHP_SELF'].'?num='.$i*$per_page.'">['.$i."]</a>\n";
      }
      //-------------------------------------------------------------------------------
      mysql_close($conn);


    ?>
  </body>
</html>