Mysql与PHP实现分页

最近好久才写一篇博客,暑假生活太惬意,让我放松了好多,开学了,我要慢慢开始找回自己的状态。

mysql limit

我是使用mysql的limit语句来实现的分页效果,limit实际可以有两种用法:

  1. select * from tablename limit 10
  2. select * from tablename limit 100,10

第一种语句是取符合条件的前十条记录,后者实现的是排除前100条符合条件的记录之后,再来取十条符合条件的记录。
所谓实现分页,就是可以利用第二种limit写法来实现,假设我们有30条记录,规定每一页显示10条记录,那么我们需要三页来显示所有的记录:

  1. 第一页: select * from tablename limit 0,10;
  2. 第二页: select * from tablename limit 10,10;
  3. 第三页: select * from tablename limit 20,10;

php功能实现

实现分页功能,首页要确认要分多少页,我们需要知道符合条件的记录表到底有多少条?

$stmt = $conn->prepare("select count(*) from cart where paid=0 and del=0 and cuid=:cuid");
$stmt->bindParam(":cuid", $_SESSION["uid"]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$total_records = $result[0]["count(*)"];

我们查询符合条件的记录数量,除以我们每次显示记录的个数,并且向上取整:

$totalpage = ceil($total_records / $num_rec_per_page);

我们就得到了页面总数。

根据页面上传递过来的page参数来选择性的显示数据;

if($_GET["page"]>$totalpage){
       $_GET["page"] = $totalpage;
};
if($_GET["page"]<1){
       $_GET["page"] = 1;
};

我们传递的page参数不可以小于1,也不可以大于页面的总数。

然后再根据page参数来定制mysql查询语句:

$stmt_page = $conn->prepare("select * from cart where paid=0 and del=0 and cuid=:cuid order by cid asc limit :prev , :per");
$stmt_page->bindParam(":cuid", $_SESSION["uid"]);
$stmt_page->bindParam(":prev",$prev);
$stmt_page->bindParam(":per",$per );
$per=5;
$prev = (intval($_GET["page"])-1)*$per;
$stmt_page->execute();
$result_page = $stmt_page->fetchAll(PDO::FETCH_ASSOC);

就这样,简单的mysql分页就实现了,当然这好像有点简单过头了,哈哈。