PHP / MySQLi中最小的分页是什么?我在网上搜索并试图学习如何进行分页,但所有的例子都是巨大的,所以我想知道最小的是什么,所以我可以从那里开始然后以我的方式理解它们。谢谢你提前。
我尝试过的地方(不是我所看到的所有例子); https://github.com/BenGriffiths/pdo-mysqli-pagination; http://bluedogwebservices.com/php-pagination-with-mysqli/;
第一个是非常长的(看似),但它对我来说是有意义的,第二个更短但对我来说没有意义,我还没有寻找视频教程,所以我要去搜索对于那些人。
答案 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):
转化为,
give me the results 0 - 24, i.e. the first 25 results
因此,假设您有一个包含1000条记录的产品表,并且您需要在每页仅显示25条记录的网页上显示这些记录:在您的第一页上,这些将是上述5个条款的值:
通常,偏移量是根据当前页面和限制动态计算的,因此对于产品结果的第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
其他术语将具有以下值:
在大多数用于分页的简单用例中,唯一更改的参数是偏移量和当前页面。如果您在查询中引入了过滤器,那么除了前者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++;
?>