データベース クエリを実行するとき、場合によっては、特定のルールに従って結果をページに表示する必要があります。たとえば、クライアントの各ページに少量のデータのみを表示したい場合、ページ効果を実現しながらクエリ ページング表示機能を使用する必要があります。この記事では、PHP 開発言語のクエリ ページング機能に焦点を当て、その実装原理と手順を例を通して紹介します。
クエリ ページング表示の実装原理
クエリ ページング表示の実装原理は非常に単純で、クエリされたすべてのデータを特定のルールに従って並べ替え、それぞれに表示されるデータを制限できます。ページ数。クエリ結果をページ単位で表示します。アルゴリズムを使用して、データベース内のどのレコードを最初から最後まで表示する必要があるかを計算できます。
主な手順は次のとおりです:
1. レコードの総数を計算する: 通常、データベース内のすべてのレコード、つまりレコードの総数をクエリする必要があります。
2. 総ページ数の計算: 総レコード数と各ページに表示されるレコード数を比較することで、総ページ数を計算できます。総ページ数を各ページに表示されるレコード数で割った余りが 0 でない場合は、総ページ数を 1 増やす必要があります。
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 クエリ ページを実装します。
まず、データ ソースを構築する必要があります。ここでは、単純な学生テーブルを使用します (そのフィールドには、ID、名前、性別、年齢が含まれます):
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;
次に、データを学生に挿入します。 table Medium:
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(); } }
ページング コードの実行手順は次のとおりです:
以上がPHPでクエリページング表示機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。