Comment implémenter la pagination dans MySQL avec PHP sur Ubuntu 18.04

L'auteur a sélectionné lesthe Apache Software Foundation pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

La pagination est le concept qui consiste à contraindre le nombre de lignes renvoyées dans un jeu d'enregistrements dans des pages ordonnées distinctes afin de permettre une navigation aisée entre elles. Ainsi, lorsqu'un grand jeu de données est disponible, vous pouvez configurer votre pagination pour ne renvoyer qu'un nombre spécifique de lignes sur chaque page. Par exemple, la pagination peut aider à éviter de surcharger les utilisateurs lorsqu'un magasin en ligne contient des milliers de produits en réduisant le nombre d'éléments répertoriés sur une page, car il est souvent peu probable qu'un utilisateur ait besoin de voir chaque produit. Un autre exemple est une application qui affiche des enregistrements sur un appareil mobile; l'activation de la pagination dans un tel cas diviserait les enregistrements en plusieurs pages pouvant mieux s'adapter à un écran.

Outre les avantages visuels pour les utilisateurs finaux, la pagination accélère les applications car elle réduit le nombre d'enregistrements renvoyés à la fois. Cela limite les données qui doivent être transmises entre le client et le serveur, ce qui permet de préserver les ressources du serveur telles que la RAM.

Dans ce didacticiel, vous allez créer un scriptPHP pour vous connecter à votre base de données et implémenter la pagination dans votre script en utilisant lesMySQLLIMIT clause.

Conditions préalables

Avant de commencer, vous aurez besoin des éléments suivants:

[[step-1 -—- creation-a-database-user-and-a-test-database]] == Étape 1 - Création d'un utilisateur de base de données et d'une base de données de test

Dans ce didacticiel, vous allez créer un script PHP qui se connectera à une base de données MySQL, récupérera des enregistrements et les affichera dans une page HTML dans une table. Vous allez tester le script PHP de deux manières différentes à partir de votre navigateur Web. Tout d'abord, créez un script sans code de pagination pour voir comment les enregistrements sont affichés. Deuxièmement, ajouter du code de navigation de page dans le fichier PHP pour comprendre le fonctionnement pratique de la pagination.

Le code PHP nécessite un utilisateur MySQL pour l'authentification et un exemple de base de données pour la connexion. Dans cette étape, vous allez créer un utilisateur non root pour votre base de données MySQL, un exemple de base de données et un tableau pour tester le script PHP.

Pour commencer, connectez-vous à votre serveur. Puis connectez-vous à votre serveur MySQL avec la commande suivante:

sudo mysql -u root -p

Entrez le mot de passeroot de votre serveur MySQL et appuyez surENTER pour continuer. Ensuite, vous verrez l’invite MySQL. Pour créer un exemple de base de données, que nous appelleronstest_db dans ce didacticiel, exécutez la commande suivante:

Create database test_db;

Vous verrez la sortie suivante:

OutputQuery OK, 1 row affected (0.00 sec)

Ensuite, créez untest_user et accordez à l'utilisateur tous les privilèges sur lestest_db. RemplacezPASSWORD par une valeur forte:

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

Rechargez les privilèges MySQL avec:

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

Ensuite, passez à la base de donnéestest_db pour commencer à travailler directement sur la base de donnéestest_db:

Use test_db;
OutputDatabase changed

Créez maintenant une tableproducts. Le tableau contiendra vos exemples de produits. Pour ce didacticiel, vous n'aurez besoin que de deux colonnes pour les données. La colonneproduct_id servira de clé primaire pour identifier de manière unique chaque enregistrement. Vous utiliserez le champproduct_name pour différencier chaque élément par son nom:

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

Pour ajouter dix produits de test à la tableproducts, exécutez les instructions SQL suivantes:

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');

Vous verrez cette sortie:

OutputQuery OK, 1 row affected (0.02 sec)

Vérifiez que les produits ont été insérés dans la table en exécutant:

select * from products;

Vous verrez les produits dans votre sortie dans les deux colonnes:

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)

Quittez MySQL:

quit;

Avec la base de données exemple, la table et les données de test en place, vous pouvez maintenant créer un script PHP pour afficher les données sur une page Web.

[[step-2 -—- display-mysql-records-without-pagination]] == Étape 2 - Affichage des enregistrements MySQL sans pagination

Vous allez maintenant créer un script PHP qui se connecte à la base de données MySQL créée à l’étape précédente et qui répertorie les produits dans un navigateur Web. Dans cette étape, votre code PHP s'exécutera sans aucune forme de pagination afin de montrer comment les enregistrements non divisés s'affichent sur une seule page. Bien que vous ne disposiez que de dix enregistrements à des fins de test dans ce didacticiel, leur affichage sans pagination montrera pourquoi la segmentation des données créera au final une meilleure expérience utilisateur et allégera la charge du serveur.

Créez le fichier de script PHP à la racine du document de votre site Web à l'aide de la commande suivante:

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

Ajoutez ensuite le contenu suivant au fichier. N'oubliez pas de remplacerPASSWORD par la valeur correcte du mot de passe que vous avez attribué auxtest_user à l'étape précédente:

/var/www/html/pagination_test.php

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 "";

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

        echo "";

        echo "";

        echo "";

    }

    echo "
".$row['product_id']."".$row['product_name']."
"; } catch(PDOException $e) { echo $e->getMessage(); } ?>

Enregistrez le fichier en appuyant surCTRL+X,Y etENTER.

Dans ce script, vous vous connectez à la base de données MySQL à l'aide de la bibliothèquePDO (PHP Data Object) avec les informations d'identification de base de données que vous avez créées à l'étape 1.

PDO est une interface légère pour la connexion à des bases de données. La couche d'accès aux données est plus portable et peut fonctionner sur différentes bases de données avec juste des réécritures de code mineures. PDO a une plus grande sécurité car il prend en chargeprepared statements - une fonctionnalité pour accélérer l'exécution des requêtes de manière sécurisée.

Ensuite, vous demandez à l'API PDO d'exécuter l'instructionselect * from products et de répertorier les produits dans un tableau HTML sans pagination. La ligne$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); garantit que les types de données sont renvoyés tels qu'ils apparaissent dans la base de données. Cela signifie que PDO renverra lesproduct_id sous forme d'entier et lesproduct_name sous forme de chaîne. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); demande à PDO de lever une exception si une erreur est rencontrée. Pour un débogage plus facile, vous détectez l'erreur dans le bloc PHPtry{}...catch{}.

Pour exécuter le fichier de script PHP de/var/www/html/pagination_test.php que vous avez créé, visitez l'URL suivante en remplaçantyour-server-IP par l'adresse IP publique de votre serveur:

http://your-server-IP/pagination_test.php

Vous verrez une page avec un tableau de vos produits.

MySQL Records Displayed with a PHP script - No Pagination

Votre script PHP fonctionne comme prévu. répertorier tous les produits sur une seule page. Si vous aviez des milliers de produits, cela entraînerait une longue boucle, car les produits sont extraits de la base de données et rendus sur la page PHP.

Pour surmonter cette limitation, vous allez modifier le script PHP et inclure la clause MySQLLIMIT et quelques liens de navigation en bas du tableau pour ajouter des fonctionnalités de pagination.

[[step-3 -—- implementation-pagination-with-php]] == Étape 3 - Implémentation de la pagination avec PHP

Dans cette étape, votre objectif est de scinder les données de test en plusieurs pages gérables. Cela améliorera non seulement la lisibilité, mais utilisera aussi plus efficacement les ressources du serveur. Vous allez modifier le script PHP que vous avez créé à l'étape précédente pour l'adapter à la pagination.

Pour ce faire, vous allez implémenter la clause MySQLLIMIT. Avant d'ajouter ceci au script, voyons un exemple de la syntaxe de MySQLLIMIT:

Select [column1, column2, column n...] from [table name] LIMIT offset, records;

La clauseLIMIT prend deux arguments comme indiqué vers la fin de cette instruction. La valeuroffset est le nombre d'enregistrements à ignorer avant la première ligne. records définit le nombre maximum d'enregistrements à afficher par page.

Pour tester la pagination, vous allez afficher trois enregistrements par page. Pour obtenir le nombre total de pages, vous devez diviser le nombre total d'enregistrements de votre table avec les lignes que vous souhaitez afficher par page. Vous arrondissez ensuite la valeur résultante à l'entier le plus proche à l'aide de la fonction PHPCeil, comme indiqué dans l'exemple d'extrait de code PHP suivant:

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

Voici la version modifiée du script PHP avec le code de pagination complet. Pour inclure les codes de pagination et de navigation, ouvrez le fichier/var/www/html/pagination_test.php:

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

Ajoutez ensuite le code en surbrillance suivant à votre fichier:

/var/www/html/pagination_test.php

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

    /* Begin Paging Info */

    $page=1;

    if (isset($_GET['page'])) {
        $page=filter_var($_GET['page'], FILTER_SANITIZE_NUMBER_INT);
    }

    $per_page=3;

    $sqlcount="select count(*) as total_records from products";
    $stmt = $pdo->prepare($sqlcount);
    $stmt->execute();
    $row = $stmt->fetch();
    $total_records= $row['total_records'];

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

    $offset=($page-1)*$per_page;

    /* End Paging Info */

    $sql="select * from products limit $offset,$per_page";

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

    $stmt->execute();


    echo "";

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

        echo "";

        echo "";

        echo "";

    }

    echo "
".$row['product_id']."".$row['product_name']."
"; /* Begin Navigation */ echo ""; echo ""; if( $page-1>=1) { echo ""; } if( $page+1<=$total_pages) { echo ""; } echo ""; echo "
PreviousNext
"; /* End Navigation */ } catch(PDOException $e) { echo $e->getMessage(); } ?>

Dans votre fichier, vous avez utilisé des paramètres supplémentaires pour exécuter la pagination:

  • $page: Cette variable contient la page actuelle de votre script. Lors du déplacement entre les pages, votre script récupère un paramètre d'URL nommépage à l'aide de la variable$_GET['page'].

  • $per_page: Cette variable contient le nombre maximum d'enregistrements que vous souhaitez afficher par page. Dans votre cas, vous souhaitez répertorier trois produits sur chaque page.

  • $total_records: avant de lister les produits, vous exécutez une instruction SQL pour obtenir un nombre total d'enregistrements dans votre table cible et l'affecter à la variable$total_records.

  • $offset: Cette variable représente le nombre total d'enregistrements à ignorer avant la première ligne. Cette valeur est calculée dynamiquement par votre script PHP en utilisant la formule$offset=($page-1)*$per_page. Vous pouvez adapter cette formule à vos projets de pagination PHP. N'oubliez pas que vous pouvez modifier la variable$per_page selon vos besoins. Par exemple, vous pouvez le changer en une valeur de50 pour afficher cinquante éléments par page si vous utilisez un site Web ou un autre montant pour un appareil mobile.

Encore une fois, visitez votre adresse IP dans un navigateur et remplacezyour_server_ip par l'adresse IP publique de votre serveur:

http://your_server_ip/pagination_test.php

Vous verrez maintenant des boutons de navigation au bas de la page. Sur la première page, vous n'obtiendrez pas de boutonPrevious. Le même cas se produit sur la dernière page où vous n'obtiendrez pas le bouton de pageNext. Notez également comment le paramètre URL depage change à mesure que vous visitez chaque page.

MySQL Records Displayed with a PHP script with Pagination - Page 1

MySQL Records Displayed with a PHP script with Pagination - Page 2

Final page of MySQL Records Displayed with a PHP script with Pagination - Page 4

Les liens de navigation au bas de la page sont réalisés à l'aide de l'extrait de code PHP suivant de votre fichier:

/var/www/html/pagination_test.php

. . .
    if( $page-1>=1) {
        echo "Previous";
    }

    if( $page+1<=$total_pages) {
        echo "Next";
    }
. . .

Ici, la variable$page représente le numéro de page actuel. Ensuite, pour obtenir la page précédente, le code sera moins1 de la variable. Donc, si vous êtes à la page 2, la formule(2-1) vous donnera un résultat de1 et ce sera la page précédente à apparaître dans le lien. Cependant, gardez à l'esprit qu'il n'affichera la page précédente que s'il y a un résultat supérieur ou égal à1.

De même, pour accéder à la page suivante, vous en ajoutez un à la variable$page et vous devez également vous assurer que le résultat$page que nous ajoutons au paramètre URL depage n'est pas supérieur à le nombre total de pages que vous avez calculé dans votre code PHP.

À ce stade, votre script PHP fonctionne avec la pagination et vous pouvez implémenter la clause MySQLLIMIT pour une meilleure navigation dans les enregistrements.

Conclusion

Dans ce tutoriel, vous avez implémenté la pagination dans MySQL avec PHP sur un serveur Ubuntu 18.04. Vous pouvez utiliser ces étapes avec un jeu d'enregistrements plus volumineux à l'aide du script PHP pour inclure la pagination. En utilisant la pagination sur votre site Web ou votre application, vous pouvez créer une meilleure navigation des utilisateurs et une utilisation optimale des ressources sur votre serveur.

À partir de là, vous pouvez envisager d’optimiser davantage votre base de données et d’autres tâches à l'aide de ces didacticiels: