4

PHP/MySQLi 中分页的最低要求是多少?我在网上搜索并尝试学习如何进行分页,但所有示例都很大,所以我想知道最低限度是什么,以便我可以从那里开始,然后努力理解它们。

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

第一个非常长(似乎),但对我来说部分意义,第二个较短但对我来说意义不大,我还没有寻找视频教程,所以我也要搜索那些.

4

3 回答 3

4

事实上,数据库与分页算法关系不大。无论使用哪个数据库或数据库驱动程序,甚至根本不涉及数据库,这都是一样的。

正如你将在下面看到的,数据库操作将只需要 2 次调用,使用safeMysql 抽象库(尽管你可以使用任何你喜欢的东西)。
从数据库中,我们将需要数据本身和记录总数。

为了获得这些,我们将使用两个 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 参数这样的基本部分。

于 2013-07-25T13:38:14.033 回答
3

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

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

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

以下面的示例查询为例:

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

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

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

这转化为,

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

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

  • 限制(每页结果)=> 25
  • 偏移量 => 0
  • 当前页面 => 1
  • 总结果 => 1000
  • 页数 => 总结果 / 限制 => 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

其他术语将具有以下值:

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

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

希望以上的解​​释能够帮助你对分页有一个基本的了解。

于 2013-08-04T16:56:05.473 回答
-1

我们将使用来自 $_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++;
?>
于 2013-07-25T05:45:14.190 回答