在進行資料庫查詢時,在某些情況下,我們需要將結果依照一定的規則進行分頁顯示。例如,當我們想要讓客戶端的每一頁只展示少量的資料時,在實現頁面效果的同時,我們需要使用查詢分頁顯示功能。本文將聚焦於PHP開發語言的查詢分頁功能,透過實例介紹它的實作原理與步驟。
查詢分頁顯示的實作原理
查詢分頁顯示的實作原理很簡單,我們可以把查詢到的所有資料依照一定的規則排序,然後透過限制每頁資料顯示的數量,將查詢結果進行分頁顯示。我們可以透過演算法計算出需要顯示的記錄從資料庫中的哪一筆開始,到哪一筆為止。
主要步驟如下:
1.計算總記錄數:通常情況下,我們需要查詢資料庫中所有的記錄,也即總記錄數。
2.計算總頁數:透過總記錄數和每頁顯示記錄數的比對,可以算出總頁數。如果總頁數除以每頁顯示記錄數所得到的餘數不為零,則總頁數需要加一。
3.查詢目前頁的資料:計算出目前頁的需要查詢的記錄的開始和結束位置,然後使用SQL語句查詢資料。不過這裡的SQL語句需要進行一些改造,不能只是簡單地查詢全部記錄,而是需要增加查詢條件和限制查詢結果的數量。
4.分頁顯示:透過頁面分頁元件,可以方便的進行分頁顯示。通常情況下,分頁元件會將總記錄數、目前頁數、總頁數等資訊進行展示。同時,也可以透過點擊不同的頁數來實現不同頁的資料查詢和顯示。
程式碼實作
為了實作這些步驟,我們需要使用一個PHP函數來進行分頁的處理。通常情況下,這個函數需要接收一些必要的參數,例如總記錄數、每頁顯示記錄數、目前頁數等。以Mysql資料庫為例,以下是常見的一個PHP分頁函數:
function get_data($page_size,$sql,$conn){ global $start; if(!$page_size) $page_size = 10; $page = $_GET['page']?$_GET['page']:1; $start=($page-1)*$page_size; //这里是高亮应用,可以注释掉 $sql_limit = $sql." limit $start,$page_size"; //组合成一条完整的sql语句 $result = mysql_query($sql_limit,$conn); while($row = mysql_fetch_array($result)){ $data[] = $row; } return $data; }
上面的函數主要實現了根據每頁展示數、總記錄數以及當前頁數來查詢並傳回需要展示的資料的功能。接下來,我們將和您一起實作一個包含分頁功能的PHP查詢頁面。
首先,我們需要建構一個資料來源,這裡我們使用一個簡單的students表(其欄位包含id、name、gender、age):
CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `gender` enum('male','female') NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然後將資料插入到students表中:
INSERT INTO `students` (`id`, `name`, `gender`, `age`) VALUES (1, 'Tom', 'male', 19), (2, 'Lucy', 'female', 20), (3, 'Lily', 'female', 18), (4, 'Kevin', 'male', 19), (5, 'Steve', 'male', 21), (6, 'Tony', 'male', 20), (7, 'Henry', 'male', 20), (8, 'Alex', 'male', 18), (9, 'Sara', 'female', 21), (10, 'Lily', 'female', 20), (11, 'Michael', 'male', 19), (12, 'Paul', 'male', 22), (13, 'Elena', 'female', 18), (14, 'Jack', 'male', 21), (15, 'Bob', 'male', 19), (16, 'Sophie', 'female', 20), (17, 'Lisa', 'female', 21), (18, 'Lucas', 'male', 19), (19, 'Laura', 'female', 18), (20, 'John', 'male', 20);
我們需要實現以下3個檔案:
內容如下:
index.php:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>PHP分页查询 - 测试页面</title> </head> <body> <?php include("db.class.php"); //加载数据库操作类 include("page.class.php"); //加载分页类 $page = new page(); //初始化分页类 $db = new db("localhost","root","","test","$conn"); //连接数据库 $count = $db->query("SELECT count(*) FROM students"); //查询总记录数 $page->get_page($count,10); //调用分页方法,传入总记录数和每页显示记录数 $genders = array("male"=>"男性","female"=>"女性"); $results = $db->query("SELECT * FROM students {$page->limit}"); //获取当前页数据 foreach($results as $row){ //遍历数据并渲染页面 $gender = $genders[$row["gender"]]; echo $row["id"]." ".$row["name"]." ".$gender." ".$row["age"]."<br/>"; } echo $page->display_pages(); //渲染分页组件 ?> </body> </html>
#page.class.php:
<?php /** * PHP分页类 */ class page { public $total = 0; //总记录数 public $page_size = 10; //每页显示的记录数 public $cur_page = 1; //当前页数 public $cur_offset = 0; //当前偏移量 public $total_page = 0; //总页数 public $limit = "";//分页查询限制语句 public function __construct(){ $this->cur_page = isset($_GET['page'])? intval($_GET['page']):1; //获取当前页,默认为第一页 } /** * 生成分页显示代码 */ public function display_pages(){ $page_list = ""; $url_s = $_SERVER['REQUEST_URI'] . (strpos($_SERVER['REQUEST_URI'], '?')?'':"?")."&page="; //上一页 if($this->cur_page>1){ $page_list.="<a href='{$url_s}1'>首页</a>"; $page_list.="<a href='{$url_s}".($this->cur_page-1)."'>上一页</a>"; } //数字页码 for($i=1;$i<=$this->total_page;$i++){ if($i==$this->cur_page){ $page_list.="<span class='current'>".$i."</span>"; } else { $page_list.="<a href='{$url_s}{$i}'>$i</a>"; } } //下一页 if($this->cur_page<$this->total_page){ $page_list.="<a href='{$url_s}".($this->cur_page+1)."'>下一页</a>"; $page_list.="<a href='{$url_s}{$this->total_page}'>尾页</a>"; } $page_list.="共{$this->total_page}页,"; $page_list.="<form method='' action=''><input type='text' size='1' name='page'/><input type='submit' value='跳转'/></form>"; return $page_list; } /** * 计算分页相关参数 * @param int $count 总记录数 * @param int $page_size 每页显示记录数 */ public function get_page($count,$page_size){ $this->total = intval($count); //总记录数 $this->page_size = intval($page_size); //每页显示多少条 $this->total_page = ceil($this->total/$this->page_size); //总页数 $this->cur_page = min($this->total_page,max(1,intval($this->cur_page))); //当前页码 $this->cur_offset = ($this->cur_page-1)*$this->page_size; //当前查询的偏移量 $this->limit = " LIMIT {$this->cur_offset},{$this->page_size}"; //查询限制语句 } }
db.class.php:
<?php /** * 数据库操作类 */ class db { private $conn; public function __construct($db_host,$db_user,$db_pass,$db_name){ $this->conn = new mysqli($db_host,$db_user,$db_pass,$db_name); if(mysqli_connect_errno()) { exit("连接数据库失败!"); } $this->conn->query("SET NAMES 'utf8'"); } /** * mysql查询 */ public function query($sql){ $results = array(); $query = $this->conn->query($sql); if(!$query) return false; while($row = $query->fetch_array(MYSQLI_ASSOC)){ $results[] = $row; } return $results; } public function __destruct(){ $this->conn->close(); } }
分頁程式碼的執行步驟如下:
運行index.php檔案之後,我們會看到一個分頁展示的頁面,它會按照我們預期的方式進行每頁展示數量、頁碼列表和展示結果的準確性。
以上是php怎麼實作查詢分頁顯示功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!