ホームページ >バックエンド開発 >PHPの問題 >PHPでクエリページング表示機能を実装する方法

PHPでクエリページング表示機能を実装する方法

PHPz
PHPzオリジナル
2023-04-24 10:52:441253ブラウズ

データベース クエリを実行するとき、場合によっては、特定のルールに従って結果をページに表示する必要があります。たとえば、クライアントの各ページに少量のデータのみを表示したい場合、ページ効果を実現しながらクエリ ページング表示機能を使用する必要があります。この記事では、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 つのファイルを実装する必要があります:

  1. index.php. このファイルは、ページング プロセスの実際のキャリアです. ページング プロセスを処理する関数を呼び出す必要があり、関数の戻り値に基づいてデータ出力が行われます。
  2. page.class.php、このクラスは主にページング関数を実装します。これには、ページング オブジェクトを定義するときに渡す必要があるパラメーターと、ページングの計算に関連するコア関数が含まれます。
  3. db.class.php、このクラスは主にデータベース関連の操作をカプセル化して管理するために使用されます。

内容は次のとおりです。

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=&#39;{$url_s}1&#39;>首页</a>";
            $page_list.="<a href=&#39;{$url_s}".($this->cur_page-1)."'>上一页</a>";
        }
        //数字页码
        for($i=1;$i<=$this->total_page;$i++){
            if($i==$this->cur_page){
                $page_list.="<span class=&#39;current&#39;>".$i."</span>";
            } else {
                $page_list.="<a href=&#39;{$url_s}{$i}&#39;>$i</a>";
            }
        }
        //下一页
        if($this->cur_page<$this->total_page){
            $page_list.="<a href=&#39;{$url_s}".($this->cur_page+1)."'>下一页</a>";
            $page_list.="<a href=&#39;{$url_s}{$this->total_page}'>尾页</a>";
        }
        $page_list.="共{$this->total_page}页,";
        $page_list.="<form method=&#39;&#39; action=&#39;&#39;><input type=&#39;text&#39; size=&#39;1&#39; name=&#39;page&#39;/><input type=&#39;submit&#39; value=&#39;跳转&#39;/></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();
    }
}

ページング コードの実行手順は次のとおりです:

  1. まず、db.class.php を呼び出してデータベースへの接続を確立する必要があります。
  2. query() メソッドによるクエリ レコードの総数;
  3. get_page() メソッドを呼び出して、表示される総ページ数を事前計算し、クエリ ステートメントで制限値を定義します。クエリの数と開始点を制限するには;
  4. レンダリング関数 display_pages() を使用して、ページング表示コンポーネントをレンダリングします。
index.php ファイルを実行すると、ページ分割された表示ページが表示され、ページごとの表示数、ページ番号リスト、表示結果の精度が表示されます。我々は期待していた。

以上がPHPでクエリページング表示機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。