_著者はhttps://www.brightfunds.org/organizations/apache-software-foundation[the Apache Software Foundation]を選択して、https://do.co/w4do-cta [Donationsの書き込み]の一部として寄付を受け取りました]プログラム。

前書き

ページネーションは、レコードセットで返される行の数を別々の整然としたページに制限する概念であり、それらの間を簡単に移動できるようにするため、大きなデータセットがある場合は、ページごとに特定の行数のみを返すようにページネーションを設定できます。 たとえば、ページにリストされるアイテムの数を減らすことで、ウェブストアに何千もの製品が含まれる場合、ユーザーがすべての製品を表示する必要はほとんどないため、ページネーションは圧倒的なユーザーの回避に役立ちます。 別の例は、モバイルデバイスでレコードを表示するアプリケーションです。このような場合にページネーションを有効にすると、レコードが複数のページに分割され、画面に収まりやすくなります。

エンドユーザーにとっての視覚的な利点に加えて、ページネーションは、一度に返されるレコードの数を減らすため、アプリケーションを高速化します。 これにより、クライアントとサーバー間で送信する必要のあるデータが制限され、RAMなどのサーバーリソースの保持に役立ちます。

このチュートリアルでは、https://www.php.net/ [PHP]スクリプトを作成してデータベースに接続し、https://www.mysql.com/ [MySQL] httpsを使用してスクリプトにページネーションを実装します。 ://dev.mysql.com/doc/refman/5.5/en/limit-optimization.html [`+ LIMIT +`句]。

前提条件

開始する前に、次のものが必要です。

手順1-データベースユーザーとテストデータベースの作成

このチュートリアルでは、MySQLデータベースに接続してレコードを取得し、テーブル内のHTMLページに表示するPHPスクリプトを作成します。 Webブラウザから2つの異なる方法でPHPスクリプトをテストします。 最初に、ページネーションコードなしでスクリプトを作成して、レコードの表示方法を確認します。 次に、ページ編集コードをPHPファイルに追加して、ページネーションが実際にどのように機能するかを理解します。

PHPコードには、認証目的のMySQLユーザーと接続するサンプルデータベースが必要です。 この手順では、PHPスクリプトをテストするために、MySQLデータベース、サンプルデータベース、およびテーブルの非ルートユーザーを作成します。

サーバーへのログインを開始します。 次に、次のコマンドを使用してMySQLサーバーにログインします。

sudo mysql -u root -p

MySQLサーバーの* root *パスワードを入力し、 `+ ENTER `を押して続行します。 次に、MySQLプロンプトが表示されます。 このチュートリアルで「+」と呼ぶサンプルデータベースを作成するには、次のコマンドを実行します。

Create database ;

次の出力が表示されます。

OutputQuery OK, 1 row affected (0.00 sec)

次に、「」を作成し、「」に対するすべての権限をユーザーに付与します。 `++`を強力な値に置き換えます。

GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY '';
OutputQuery OK, 1 row affected (0.00 sec)

次を使用してMySQL権限をリロードします。

FLUSH PRIVILEGES;
OutputQuery OK, 1 row affected (0.00 sec)

次に、 “データベースに切り替えて、 “データベースで直接作業を開始します。

Use
OutputDatabase changed

ここで、「+ products 」テーブルを作成します。 表にはサンプル製品が含まれます。このチュートリアルでは、データ用に2列のみが必要です。 ` product_id `カラムは、各レコードを一意に識別するための主キーとして機能します。 ` product_name +`フィールドを使用して、各アイテムを名前で区別します。

Create table products (product_id BIGINT PRIMARY KEY, product_name VARCHAR(50) NOT NULL ) Engine = InnoDB;
OutputQuery OK, 0 rows affected (0.02 sec)

10個のテスト製品を「+ products +」テーブルに追加するには、次のSQLステートメントを実行します。

Insert into products(product_id, product_name) values ('1', 'WIRELESS MOUSE');
Insert into products(product_id, product_name) values ('2', 'BLUETOOTH SPEAKER');
Insert into products(product_id, product_name) values ('3', 'GAMING KEYBOARD');
Insert into products(product_id, product_name) values ('4', '320GB FAST SSD');
Insert into products(product_id, product_name) values ('5', '17 INCHES TFT');
Insert into products(product_id, product_name) values ('6', 'SPECIAL HEADPHONES');
Insert into products(product_id, product_name) values ('7', 'HD GRAPHIC CARD');
Insert into products(product_id, product_name) values ('8', '80MM THERMAL PRINTER');
Insert into products(product_id, product_name) values ('9', 'HDMI TO VGA CONVERTER');
Insert into products(product_id, product_name) values ('10', 'FINGERPRINT SCANNER');

次の出力が表示されます。

OutputQuery OK, 1 row affected (0.02 sec)

以下を実行して、製品がテーブルに挿入されたことを確認します。

select * from products;

出力の製品は2つの列内に表示されます。

Output+------------+-----------------------+
| product_id | product_name          |
+------------+-----------------------+
|          1 | WIRELESS MOUSE        |
|          2 | BLUETOOTH SPEAKER     |
|          3 | GAMING KEYBOARD       |
|          4 | 320GB FAST SSD        |
|          5 | 17 INCHES TFT         |
|          6 | SPECIAL HEADPHONES    |
|          7 | HD GRAPHIC CARD       |
|          8 | 80MM THERMAL PRINTER  |
|          9 | HDMI TO VGA CONVERTER |
|         10 | FINGERPRINT SCANNER   |
+------------+-----------------------+
10 rows in set (0.00 sec)

MySQLを終了します。

quit;

サンプルデータベース、テーブル、およびテストデータを配置したら、Webページにデータを表示するPHPスクリプトを作成できます。

手順2-ページ区切りなしのMySQLレコードの表示

ここで、前の手順で作成したMySQLデータベースに接続するPHPスクリプトを作成し、Webブラウザーで製品を一覧表示します。 このステップでは、ページ分割の形式を使用せずにPHPコードを実行して、非分割レコードが単一ページにどのように表示されるかを示します。 このチュートリアルではテスト目的のレコードは10個しかありませんが、ページネーションなしのレコードを見ると、データをセグメント化することで最終的にユーザーエクスペリエンスが向上し、サーバーの負荷が軽減される理由がわかります。

次のコマンドを使用して、WebサイトのドキュメントルートにPHPスクリプトファイルを作成します。

sudo nano /var/www/html/pagination_test.php

次に、次のコンテンツをファイルに追加します。 前のステップで「」に割り当てたパスワードの正しい値で「」を忘れずに置き換えてください。

/var/www/html/pagination_test.php

<?php

try {

   $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "");
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

   $sql="select * from products";

   $stmt = $pdo->prepare($sql);

   $stmt->execute();

   echo "<table border='1' align='center'>";

   while ( ($row = $stmt->fetch(PDO::FETCH_ASSOC) ) !== false) {
       echo "<tr>";

       echo "<td>".$row['product_id']."</td>";

       echo "<td>".$row['product_name']."</td>";

       echo "</tr>";

   }

   echo "</table>";

}

 catch(PDOException $e)

{
   echo  $e->getMessage();
}

?>

+ CTRL + X ++ Y +、および `+ ENTER +`を押してファイルを保存します。

このスクリプトでは、https://www.php.net/manual/en/book.pdo.php [PDO(PHP Data Object)]ライブラリとステップで作成したデータベース資格情報を使用して、MySQLデータベースに接続しています。 1。

PDOは、データベースに接続するための軽量のインターフェイスです。 データアクセス層はより移植性が高く、わずかなコードの書き換えだけで異なるデータベースで動作できます。 PDOはhttps://www.php.net/manual/en/pdo.prepared-statements.php[prepared statement]をサポートしているため、セキュリティが強化されています。これは、クエリを安全な方法で高速に実行する機能です。

次に、PDO APIに、「+ select * from products 」ステートメントを実行し、ページ番号なしでHTMLテーブルに製品を一覧表示するよう指示します。 行 ` $ pdo→ setAttribute(PDO

ATTR_EMULATE_PREPARES、false); `は、データベースに表示されるデータ型が返されることを保証します。 これは、PDOが整数として ` product_id `を返し、文字列として ` product_name `を返すことを意味します。 ` $ pdo→ setAttribute(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_EXCEPTION); `は、エラーが発生した場合にPDOに例外をスローするよう指示します。 デバッグを簡単にするために、PHPの ` try {} …​ catch {} +`ブロック内でエラーをキャッチしています。

作成したPHPスクリプトファイル「+ / var / www / html / pagination_test.php 」を実行するには、次のURLにアクセスして、「+」をサーバーのパブリックIPアドレスに置き換えます。

http:///pagination_test.php

製品の表を含むページが表示されます。

image:https://assets.digitalocean.com/articles/mysql_pagination1804/step2a.png [PHPスクリプトで表示されるMySQLレコード-ページネーションなし]

PHPスクリプトは期待どおりに機能しています。すべての製品を1ページにリストします。 数千の製品がある場合、製品がデータベースからフェッチされ、PHPページにレンダリングされるため、これにより長いループが発生します。

この制限を克服するには、PHPスクリプトを変更し、MySQLの `+ LIMIT`句といくつかのナビゲーションリンクをテーブルの下部に含めて、ページネーション機能を追加します。

ステップ3-PHPでページネーションを実装する

このステップの目標は、テストデータを複数の管理可能なページに分割することです。 これにより、読みやすくなるだけでなく、サーバーのリソースをより効率的に使用できます。 前のステップで作成したPHPスクリプトを変更して、ページネーションに対応します。

これを行うには、MySQLの `+ LIMIT `句を実装します。 これをスクリプトに追加する前に、MySQLの ` LIMIT +`構文の例を見てみましょう。

Select  from  LIMIT , ;

`+ LIMIT `句は、このステートメントの終わりに向かって示されるように2つの引数を取ります。 ` offset `値は、最初の行の前にスキップするレコードの数です。 ` records +`は、ページごとに表示するレコードの最大数を設定します。

ページネーションをテストするために、ページごとに3つのレコードを表示します。 ページの合計数を取得するには、テーブルの合計レコードをページごとに表示する行で分割する必要があります。 次に、次のPHPコードスニペットの例に示すように、PHP `+ Ceil +`関数を使用して、結果の値を最も近い整数に丸めます。

$total_pages=ceil($total_records/$per_page);

以下は、完全なページネーションコードを使用したPHPスクリプトの修正バージョンです。 ページネーションとナビゲーションコードを含めるには、 `+ / var / www / html / pagination_test.php +`ファイルを開きます:

sudo nano /var/www/html/pagination_test.php

次に、強調表示された次のコードをファイルに追加します。

/var/www/html/pagination_test.php

<?php

try {

   $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "PASSWORD");
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);























   $sql="select * from products limit ";

   $stmt = $pdo->prepare($sql);

   $stmt->execute();


   echo "<table border='1' align='center'>";

   while ( ($row = $stmt->fetch(PDO::FETCH_ASSOC) ) !== false) {
       echo "<tr>";

       echo "<td>".$row['product_id']."</td>";

       echo "<td>".$row['product_name']."</td>";

       echo "</tr>";

   }

   echo "</table>";





















}

catch(PDOException $e) {
       echo  $e->getMessage();
}

?>

ファイルでは、追加のパラメーターを使用してページングを実行しました。

  • + $ page +:この変数は、スクリプトの現在のページを保持します。 ページ間を移動するとき、スクリプトは変数「+ $ _ GET [‘page’] + `」を使用して「+ page +」という名前のURLパラメーターを取得します。

  • + $ per_page +:この変数は、ページごとに表示したい最大レコードを保持します。 あなたの場合、各ページに3つの製品をリストしたいと思います。

  • + $ total_records +:製品をリストする前に、SQLステートメントを実行してターゲットテーブル内のレコードの総数を取得し、それを `+ $ total_records +`変数に割り当てます。

  • + $ offset +:この変数は、最初の行の前にスキップする合計レコードを表します。 この値は、式 `+ $ offset =($ page-1)* $ per_page `を使用してPHPスクリプトによって動的に計算されます。 この式をPHPページネーションプロジェクトに適合させることができます。 必要に応じて、 ` $ per_page `変数を変更できることを忘れないでください。 たとえば、ウェブサイトまたはモバイルデバイス用に別の金額を実行している場合、値を「+50」の値に変更して、ページごとに50個のアイテムを表示できます。

再度、ブラウザでIPアドレスにアクセスし、「++」をサーバーのパブリックIPアドレスに置き換えます。

http:///pagination_test.php

ページの下部にいくつかのナビゲーションボタンが表示されます。 最初のページでは、* Previous ボタンは表示されません。 同じケースは、 Next *ページボタンが表示されない最後のページでも発生します。 また、各ページにアクセスすると、「+ page」URLパラメータがどのように変化するかに注意してください。

image:https://assets.digitalocean.com/articles/mysql_pagination1804/step3a.png [ページネーション付きのPHPスクリプトで表示されるMySQLレコード-ページ1]

image:https://assets.digitalocean.com/articles/mysql_pagination1804/step3b.png [ページネーション付きのPHPスクリプトで表示されるMySQLレコード-ページ2]

image:https://assets.digitalocean.com/articles/mysql_pagination1804/step3c.png [ページネーション付きのPHPスクリプトで表示されるMySQLレコードの最終ページ-ページ4]

ページの下部にあるナビゲーションリンクは、ファイルから次のPHPコードスニペットを使用して実現されます。

/var/www/html/pagination_test.php

. . .
   if( $page-1>=1) {
       echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">Previous</a></td>";
   }

   if( $page+1<=$total_pages) {
       echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page+1).">Next</a></td>";
   }
. . .

ここで、 `+ $ page `変数は現在のページ番号を表します。 次に、前のページを取得するために、コードは変数から「+1」をマイナスします。 したがって、2ページ目にいる場合、式「(2-1)」は「1」の結果を提供し、これがリンクに表示される前のページになります。 ただし、「+ 1+」以上の結果がある場合にのみ前のページが表示されることに注意してください。

同様に、次のページに移動するには、変数を + $ page +`変数に追加し、 `+ page + URLパラメーターに追加する `+ $ page +`の結果が、 PHPコードで計算した合計ページ。

この時点で、PHPスクリプトはページネーションで動作しており、レコードのナビゲーションを改善するためにMySQLの `+ LIMIT +`句を実装できます。

結論

このチュートリアルでは、Ubuntu 18.04サーバー上のPHPでMySQLのページングを実装しました。 PHPスクリプトを使用してページネーションを含めることにより、これらの手順をより大きなレコードセットで使用できます。 Webサイトまたはアプリケーションでページネーションを使用することで、ユーザーナビゲーションを改善し、サーバーでリソースを最適に使用できます。

ここから、これらのチュートリアルを使用して、データベースおよびその他のデータベースタスクのさらなる最適化を検討できます。