分页最低限度?

时间:2013-07-25 01:43:14

标签: php mysqli pagination

PHP / MySQLi中最小的分页是什么?我在网上搜索并试图学习如何进行分页,但所有的例子都是巨大的,所以我想知道最小的是什么,所以我可以从那里开始然后以我的方式理解它们。谢谢你提前。

我尝试过的地方(不是我所看到的所有例子); https://github.com/BenGriffiths/pdo-mysqli-pagination; http://bluedogwebservices.com/php-pagination-with-mysqli/;

第一个是非常长的(看似),但它对我来说是有意义的,第二个更短但对我来说没有意义,我还没有寻找视频教程,所以我要去搜索对于那些人。

3 个答案:

答案 0 :(得分:3)

事实上,数据库与分页算法没什么关系。无论使用哪个数据库或数据库驱动程序,或者甚至根本不涉及数据库,这都将是相同的。

正如您将在下面看到的,数据库操作只需要使用safeMysql abstraction library进行2次调用(尽管您可以随意使用)。 从数据库我们将需要数据本身和记录总数。

为了获得这些,我们将使用两个MySQL功能:

  • SQL_CALC_FOUND_ROWS / FOUND_ROWS()获取总行数
  • LIMIT子句限制所选数据的数量,

要显示指向页面的链接,您需要知道当前页面和总页数。

<?php
include 'safemysql.class.php';
$db = new safeMysql();

$per_page = 10;

//let's get the page number
$cur_page = 1;
if (isset($_GET['page']) && $_GET['page'] > 0) 
{
    $cur_page = $_GET['page'];
}

// then define starting record
$start = ($cur_page - 1) * $per_page;

//now let's get the data and total number of rows
$sql  = "SELECT SQL_CALC_FOUND_ROWS * FROM Board LIMIT ?i, ?i";
$data = $db->getAll($sql, $start, $per_page);
$rows = $db->getOne("SELECT FOUND_ROWS()");

//and total number of pages.
$num_pages = ceil($rows / $per_page);

//we have to define this variable to display list of pages
$page = 0;
include 'template.tpl.php';

现在,只要我们准备好所有数据,我们就可以使用原生PHP作为模板来解决它:

Records found: <b><?=$rows?></b><br><br>
<? foreach ($data as $row): ?>
    <?=++$start?>. 
    <a href="?id=<?=$row['id']?>">
         <?=$row['title']?>
    </a>
    <br>
<? endforeach ?> 

<br>
Pages: 
<? while ($page++ < $num_pages): ?>
    <? if ($page == $cur_page): ?>
         <b><?=$page?></b>
    <? else: ?> 
        <a href="?page=<?=$page?>"><?=$page?></a>
    <? endif ?> 
<? endwhile ?> 

然而,这确实是最低限度的,包括没有诸如减少显示的页数和支持其他WHERE参数等基本部分。

答案 1 :(得分:2)

分页相对简单,我会尝试用最简单的方式来描述它。

从这里开始,您将在大多数分页场景中遇到5个术语或短语(或参数):

  • 限制(或每页结果)
  • 偏移(从哪里开始结果/记录集)
  • 当前页面
  • 总结果
  • 页数

采取以下示例查询:

SELECT * FROM products WHERE active = 1 LIMIT 0 , 25

在上面的SQL中(它应该适用于mysqli):

  • 25 =&gt;是限制(或每页的结果)
  • 0 =&gt;是偏移量(即从结果或记录0开始)

转化为,

give me the results 0 - 24, i.e. the first 25 results

因此,假设您有一个包含1000条记录的产品表,并且您需要在每页仅显示25条记录的网页上显示这些记录:在您的第一页上,这些将是上述5个条款的值:

  • 限制(每页结果)=&gt; 25
  • 偏移=&gt; 0
  • 当前页面=&gt; 1
  • 总结果=&gt; 1000
  • 页数=&gt;总结果/限制=&gt; 40

通常,偏移量是根据当前页面和限制动态计算的,因此对于产品结果的第1页,偏移量将等于:

offset = (current page * limit) - limit
i.e. (1 * 25) - 25 = 0

所以你的mysqli查询将是:

SELECT * FROM products WHERE active = 1 LIMIT [OFFSET] , [LIMIT]

i.e. SELECT * FROM products WHERE active = 1 LIMIT 0 , 25

对于产品结果的第2页使用相同的原则,偏移量(或起始结果)将为:

offset = (current page * limit) - limit
i.e. (2 * 25) - 25 = 25

所以你的mysqli查询将是:

SELECT * FROM products WHERE active = 1 LIMIT [OFFSET] , [LIMIT]

i.e. SELECT * FROM products WHERE active = 1 LIMIT 25 , 25

转化为,

give me the results 25 - 49, i.e. the next 25 results starting from record 25

其他术语将具有以下值:

  • 限制(或每页结果)=&gt; 25
  • 当前页面=&gt; 2
  • 总结果=&gt; 1000
  • 页数=&gt; 40

在大多数用于分页的简单用例中,唯一更改的参数是偏移量和当前页面。如果您在查询中引入了过滤器,那么除了前者2之外,总结果和页数也会发生变化。

我希望上面的解释有助于您对分页有一个基本的了解。

答案 2 :(得分:-2)

我们将使用$ _GET脚本中的页面信息。

<?
if(isset($_GET['page'])) {
 $page = htmlspecialchars(mysql_real_escape_string($_GET['page']));
}
else {
 $page = 1; //We'll assume that if the $_GET isn't present, the first page will be shown.
}
$perpage = 25; //Number of items per page
$first = (($page-1)*$perpage); //Basically gets the first row of the page.
$q = mysql_query("SELECT * FROM table ORDER BY id ASC LIMIT $first, $perpage");
while($row = mysql_fetch_array($q)) {
//Put your output here
}

//Now, we can put our page navigator

$i = 1;
$count = mysql_num_rows(mysql_query("SELECT `id` FROM table"));
$num = ceil($count/$perpage);
while($i <= $num) {
echo "<a href='/page/".$i."'>".$i."</a> ";
$i++;
?>