在搭建自己的博客系统的时候遇到了博客分页问题,刚开始是采用比较笨的方法直接将数据全部取出来存入数组中,后来决定优化一下,利用mysql中的limit实现分页取博客。
mysql的limit用法:
mysql> SELECT * FROM orange LIMIT 5;
如果limit后只有一个参数,则该参数表示从第一条开始取多少条数据,上面代码就表示从数据库第一条开始取5条数据。
当有两个参数时:
SELECT * FROM orange LIMIT 3,2;
上述代码表示从第3+1条数据,即第四条数据开始,取两条数据,即取第4、5条数据。
前端部分我使了jquery,十分方便,后端的话使用了php来从数据库取数据。主要思路就是从前端页面通过jquery的ajax向后端请求数据,并向后端传递当前页数pageNum。后端接收到pageNum后,通过以下核心语句,来实现根据pageNum取数据库不同部分的数据,实现分页查找。(这里假设每页两篇博客)
(pageNum-1)*2的含义是,第pageNum页的内容应该时从(pageNum-1)*2 + 1条数据开始查找,即跳过前面的(pageNum - 1)*2条数据。
$pageNum = ( $pageNum - 1 )*2; $sql = 'select * from blogs limit ' . $pageNum. ',2';
下面是我本地测试的代码:
前端get.html:(有点长,需要判断最后一页,第一页的情况)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://code.jquery.com/jquery-1.12.4.js"></script> <title>mysql分页查询</title> </head> <body> <div class="app"> <button onclick="forward()">前一页</button> <button onclick="next()">后一页</button> <div id="result"> </div> </div> <script> var pageNum = 1; $(document).ready(function () { query(); }) function forward() { pageNum--; query(); } function next() { pageNum++; query(); } function query() { if (pageNum <= 0) { alert('这是第一页!'); pageNum = 1; return; } console.log(pageNum); $("#result").empty(); $.get("../get.php", { "pageNum": pageNum }, function (data, status) { console.log("Data: " + data + "\nStatus: " + status); if (data === "NULL") { pageNum--; query(); alert('没有更多数据了!'); return; } data = $.parseJSON(data); for (let i in data) { var s = "<h1>Title: " + data[i].title + "</h1>" + data[i].content; $("#result").append(s); } }); } </script> </body> </html>
后端代码get.php:
<?php $pageNum = $_GET['pageNum']; // $conn = new mysqli( $servername, $username, $password, $dbname ); $conn = new mysqli( 'localhost', 'root', 'zy20011109', 'blogs' ); if ( $conn->connect_error ) { die( '连接失败: ' . $conn->connect_error ); } $pageNum = ( $pageNum - 1 )*2; $sql = 'select * from blogs limit ' . $pageNum. ',2'; $result = $conn->query( $sql ); if ( $result->num_rows>0 ) { $blogs = array(); while( $row = $result->fetch_assoc() ) { array_push( $blogs, $row ); } echo json_encode( $blogs, JSON_UNESCAPED_UNICODE ); } else { echo 'NULL'; } $conn->close(); ?>
还有就是php返回数据格式的问题,我发现php返回的数据是string类型的数据,所以在get.html中使用时需要转换为json类型,就得到了一个json数组,通过遍历此数组,就可以得到相应的数据了。