美文网首页
PHP 原生开发 分页学习记录

PHP 原生开发 分页学习记录

作者: 无故下架内容so账号已弃用 | 来源:发表于2019-05-25 00:04 被阅读0次

需要的效果

分页效果图

涉及的知识点记录

  • MySQL: LIMIT

可以使用 limit 返回前几条或者中间某几行数据

SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初 始记录行的偏移量是 0(而不是 1)

mysql> SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: 
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

//如果只给定一个参数,它表示返回最大的记录行数目: 
mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

LIMIT 参考: http://www.blogjava.net/yemen/articles/229521.html

  • ceil 向上取整 floor 向下取整
<?php
echo ceil(4.3);    // 5
echo ceil(9.999);  // 10
echo ceil(-3.14);  // -3

echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4
?>
  • parse_str 将字符串解析成多个变量, 变量将会以数组元素的形式存入到这个数组

parse_str ( string $encoded_string , array &$result ) : void

例子:

$str = 'page=1&aaa=123&bbb=4564';
parse_str($str, $result);
print_r($result);

// Array ( [page] => 1 [aaa] => 123 [bbb] => 4564 )
  • http_build_query 使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。

例子:

$arr = array('page'=>23,'abc'=>45,'df'=>'56');
echo http_build_query($arr);

// page=23&abc=45&df=56

分割线


分割线

生成分页的函数 setPage func.php

/**
 * 生成分页
 * @param $total 总共页数
 * @param $page 当前页数
 * @param $pageSize 每页的数量
 * @param $showPage 显示分页页码的个数
 */
function setPage ($total, $page, $pageSize, $showPage=5) {
    // 分页 html 字符串
    $pageStr = '';

    // 总条数 > 一页数量 才显示分页
    if ($total > $pageSize) {
        $pageStr .= '<div class="page-nav">';
        $pageStr .= '<ul>';

        // 总页数 向上取整
        $totalPage = ceil($total / $pageSize);

        // 从 from 页开始显示, 最小为1
        $from = $page - floor(($showPage-1)/2);
        $from = $from > 1 ? $from : 1;

        // 到 to 页结束, 最大为 $totalPage
        $to = $from + $showPage - 1;

        if ($to > $totalPage) {
            $to = $totalPage;
            $from = $to - $showPage + 1;
            $from = $from > 1 ? $from : 1;
        }

        // 如果当前页不是第一页, 则
        if ($page > 1) {
            $pageStr .= '<li><a href="index.php?page=1">首页</a></li>';
            $pageStr .= '<li><a href="index.php?page='.($page - 1).'">上一页</a></li>';
        } else {
            $pageStr .= '<li><span>首页</span></li>';
            $pageStr .= '<li><span>上一页</span></li>';
        }

        // 如果 from > 1
        if ($from > 1) {
            $pageStr .= '<li>...</li>';
        }

        for ($i=$from; $i<$to+1; $i++) {
            if ($i == $page) {
                $pageStr .= '<li><span class="curr-page">'.$i.'</span></li>';
            } else {
                $pageStr .= '<li><a href="index.php?page='.$i.'">'.$i.'</a></li>';
            }
        }

        // 如果 to 小于最大页数
        if ($to < $totalPage) {
            $pageStr .= '<li>...</li>';
        }

        // 如果当前页不是最后一页,则
        if ($page < $totalPage) {
            $pageStr .= '<li><a href="index.php?page='.($page + 1).'">下一页</a></li>';
            $pageStr .= '<li><a href="index.php?page='.$totalPage.'">尾页</a></li>';
        } else {
            $pageStr .= '<li><span>下一页</span></li>';
            $pageStr .= '<li><span>尾页</span></li>';
        }

        $pageStr .= '</div>';
        $pageStr .= '</ul>';
    }

    return $pageStr;
}

点击页码, 生成请求地址的函数, getUrl func.php

(一开始通过这种方式生成动态的地址再请求, 后面我发现有点怪异的小问题没解决, 我的页面简单没有别的参数, 后面就直接写了静态跳转地址.)

// 用 getUrl() 的时候
$pageStr .= '<li><a href="'.getUrl($page+1).'">下一页</a></li>';

改成了

// 不用 getUrl() 的时候
$pageStr .= '<li><a href="index.php?page='.($page + 1).'">下一页</a></li>';

getUrl()

/**
 * 根据 page 生成页面请求地址
 * @param $page 点击的页码
 * @return string $urlStr 地址字符串
 */
function getUrl ($page) {
    // 协议
    $http = $_SERVER['SERVER_PORT'] === 443 ? 'https://' : 'http://';
    // 域名地址
    $host = $_SERVER['HTTP_HOST'];
    // 地址的路径以及后面的参数
    $url = $_SERVER['REQUEST_URI'];

    // ? 所在的索引位置
    $pos = strpos($url, '?');

    // 问号前的路径
    $fileUrl = substr($url, 0, $pos);

    // 需要的地址字符串
    $urlStr = $http.$host.$fileUrl;

    if ($pos === false) {
        // 没有参数的情况
        $urlStr .= '?page='.$page;
    } else {
        // 获取问号之后的字符串
        $subStrUrl = substr($url, $pos+1);

        // 转成数组
        parse_str($subStrUrl, $parseStrUrl);

        // 去掉 page 参数
        if (isset($parseStrUrl['page'])) {
            unset($parseStrUrl['page']);
        }

        // 插入新的page
        $parseStrUrl['page'] = $page;

        // 将数组重新转成字符串
        $urlStr .= '?'.http_build_query($parseStrUrl);

    }

    return $urlStr;
}

调用函数生成分页 index.php

<?php
require_once './common/func.php';

// 开启会话
session_start();

// 读取 session
$user = null;
if (isset($_SESSION['user']) && !empty($_SESSION['user'])) {
    $user = $_SESSION['user'];
}

// 当前页码
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;

// 页码数不能小于 1
$page = max($page, 1);

// 每页条数
$pageSize = 3;

// rows
$rows = ($page - 1)*$pageSize;

// 连接数据库
$connect = initdb();

// 查询总共条数
$selectCountSql = "SELECT COUNT(`goods_id`) as total FROM `goods` WHERE `delete_status`=1";

$totals = mysqli_fetch_all(mysqli_query($connect, $selectCountSql), MYSQLI_ASSOC);
if (!$totals) {
    redirectMsg('数据查询失败!原因:'.mysqli_error($connect), '0', 'index.php');
}
// 总条数
$total = $totals[0]['total'];

// 总页数 向上取整
$totalPage = ceil($total / $pageSize);

if ($page > $totalPage) {
    redirectMsg('该页数不存在!', '0', 'index.php');
}

// 查询语句 分页查询
$selectSql = "SELECT `goods_id`,`goods_name`,`desc`,`img_url` FROM `goods` WHERE `delete_status`=1 ORDER BY `modify_time` LIMIT {$rows},{$pageSize}";

$result = mysqli_fetch_all(mysqli_query($connect, $selectSql), MYSQLI_ASSOC);
if (!$result) {
    redirectMsg('数据查询失败!原因:'.mysqli_error($connect), '0', 'index.php');
}

$pages = setPage($total, $page, $pageSize, 3);
?>
<!DOCTYPE html>
<html lang="en">
<head>
// code...

输出分页

// code...
<body>
  <div class="list">
    // 这里是数据列表
  </div>
  <?php echo $pages;?>
</body>
// code...

结果

结果

参考资料: https://class.imooc.com/sc/22

相关文章

网友评论

      本文标题:PHP 原生开发 分页学习记录

      本文链接:https://www.haomeiwen.com/subject/gkadzqtx.html