博客列表 >分页原理与案例--2019年6月11日22:30分

分页原理与案例--2019年6月11日22:30分

白守的博客
白守的博客原创
2019年06月16日 15:16:31721浏览

分页原理

基本术语

记录索引: 记录在表中的位置,从0开始(与主键无关)

偏移量: 每页显示的起始位置

显示数量: 每页默认的显示数量


2. SQL中的分页关键字

`LIMIT m OFFSET n`

`LIMIT m`: 每页显示的记录数量

`OFFSET n`: 从指定的索引n开始显示


3. 偏移量计算公式

offset = num * (page - 1)



总结

比如数据库用100条数据

每一次访问的时候只获取10条,我们就获取数据的时候设置只获取0-9的数据,第二页的时候获取10-19的数据.....

这时我们需要计算偏移量,公式就是这个   offset = num * (page - 1) 

简单点来说就是 

偏移量 = 当前显示数量 * (当前页码 - 1)


实例

<?php
// 获取当前要显示的页数
$page = intval($_GET['p']);

$pdo = new PDO('mysql:dbname=php', 'root', 'root');

// 每页显示数量
$num = 5;

// 总页数: 需要分二步, 第一求出总记录数量, 第二总记录数量除以每页显示的记录数量,再向上取整
$sql = "SELECT CEIL(COUNT(`mov_id`)/{$num}) FROM `movies`";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$pages = $stmt->fetchColumn(0);


// 每页的显示起止位置: 偏移量
// 偏移量 = 当前显示数量 * (当前页码 - 1)
$offset = $num * ($page - 1);

$sql = "SELECT `mov_id`,`name`, CONCAT(LEFT(`detail`,20),'...') FROM `movies` LIMIT {$num} OFFSET {$offset} ";
$stmt = $pdo->prepare($sql);

$stmt->execute();

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo json_encode([$pages, $result]);

运行实例 »

点击 "运行实例" 按钮查看在线实例


实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>最新影视剧介绍</title>
    <style>
        /*设置表格样式*/

        table
        {
            /*折叠表格线与单元格之间的间隙*/
            border-collapse:collapse;
            width: 90%;
        }

        /*设置表格与单元格边框*/
        table,th, td
        {
            border: 1px solid black;
        }
        /*设置标题行背景色*/
        table thead tr:first-of-type {
            background-color: lightblue;
        }
        /*设置每一列的宽度*/
        table tbody tr td:nth-of-type(1) {
            width: 10%;
        }
        table tbody tr td:nth-of-type(2){
            width: 20%;
        }
        table tbody tr td:nth-of-type(3) {
            width: 70%;
        }

        /*设置分页条样式*/
        ul {
            text-align: center;
        }
        ul li {
            /*去掉默认样式*/
            list-style-type: none;
            /*转为水平显示*/
            display: inline-block;
            width: 30px;
            height: 20px;
            border: 1px solid black;
            /*垂直水平居中*/
            text-align: center;
            line-height: 20px;
            cursor: pointer;
            margin-left: 5px;
        }
        ul li:hover {
            background-color: lightblue;
            border: 1px solid red;
        }

        /*作业: 如何设置当前页码的高亮?*/
        .active {
            background-color: lightblue;
            border: 1px solid red;
        }
    </style>
</head>
<!-- isset($_GET['p'] ? $_GET['p'] : 1  -->
<body onload="getData(<?php echo $_GET['p'] ?? 1; ?>)">
<table>
    <caption>最新影视剧介绍</caption>
    <thead>
    <tr>
        <th>序号</th>
        <th>片名</th>
        <th>简介</th>
    </tr>
    </thead>
<!--        tr*5>td{x}*3-->
    <tbody>
    </tbody>
</table>

<!--分页条-->
<ul>

</ul>

<script>
    function getData(p) {
    // 创建 Ajax对象
    var request = new XMLHttpRequest();
    // 监听请求
    request.onreadystatechange = function () {
        // 请求成功
        if (request.readyState === 4) {
            var data  = JSON.parse(request.responseText);
            console.log(data);

            // 1. 动态显示分页条
            var ul = document.getElementsByTagName('ul').item(0);
            for (var i = 0; i < data[0]; i++) {
                var li = document.createElement('li');
                li.innerText = (i+1);

                // 设置当前页面高亮,p是Number,需要转String才可以比较
                li.className = (li.innerText === p.toString()) ? 'active' : null;

                // 动态显示数据
               li.onclick = function () {
                   var search = location.search.slice(0,3) + this.innerText;

                   location.replace(search);    //替换当前请求
               };
                // 将表格内容渲染到页面中...
                ul.appendChild(li);
            }



            // 2. 显示当前页内容
            var tbody = document.getElementsByTagName('tbody').item(0);
            console.log(data[1]);
            data[1].forEach(function (value){
                console.log(value);
                var tr = document.createElement('tr');
                for (var key in value) {
                    var td = document.createElement('td');
                    td.innerText = value[key];
                    tr.appendChild(td);
                }
                tbody.appendChild(tr);
            });

        }
    };

    // 配置请求
    request.open('GET', 'get_movies.php?p='+p.toString(), true);
    // 发送请求
    request.send(null);
    }
</script>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议