So implementieren Sie Paginierung in MySQL mit PHP unter Ubuntu 18.04

Der Autor hat diethe Apache Software Foundationausgewählt, um eine Spende im Rahmen desWrite for DOnations-Programms zu erhalten.

Einführung

Paginierung ist das Konzept, bei dem die Anzahl der zurückgegebenen Zeilen in einer Datensatzgruppe auf separate, geordnete Seiten beschränkt wird, um eine einfache Navigation zwischen diesen zu ermöglichen. Wenn also ein großer Datensatz vorhanden ist, können Sie die Paginierung so konfigurieren, dass nur eine bestimmte Anzahl von Zeilen auf jeder Seite zurückgegeben wird. Durch Paginierung können Sie beispielsweise verhindern, dass Benutzer überfordert werden, wenn ein Webshop Tausende von Produkten enthält, indem Sie die Anzahl der auf einer Seite aufgelisteten Artikel verringern, da es häufig unwahrscheinlich ist, dass ein Benutzer jedes Produkt anzeigen muss. Ein weiteres Beispiel ist eine Anwendung, die Aufzeichnungen auf einem mobilen Gerät anzeigt. Wenn Sie in einem solchen Fall die Paginierung aktivieren, werden die Datensätze in mehrere Seiten aufgeteilt, die besser auf einen Bildschirm passen.

Neben den visuellen Vorteilen für Endbenutzer beschleunigt die Paginierung die Anwendung, da weniger Datensätze gleichzeitig zurückgegeben werden. Dies begrenzt die Daten, die zwischen dem Client und dem Server übertragen werden müssen, wodurch Serverressourcen wie RAM geschont werden.

In diesem Lernprogramm erstellen Sie einPHP-Skript, um eine Verbindung zu Ihrer Datenbank herzustellen und die Paginierung Ihres Skripts mithilfe vonMySQLLIMIT clause zu implementieren.

Voraussetzungen

Bevor Sie beginnen, benötigen Sie Folgendes:

[[Schritt 1 - Erstellen eines Datenbankbenutzers und einer Testdatenbank] == Schritt 1 - Erstellen eines Datenbankbenutzers und einer Testdatenbank

In diesem Tutorial erstellen Sie ein PHP-Skript, das eine Verbindung zu einer MySQL-Datenbank herstellt, Datensätze abruft und diese in einer HTML-Seite in einer Tabelle anzeigt. Sie können das PHP-Skript in Ihrem Webbrowser auf zwei verschiedene Arten testen. Erstellen Sie zunächst ein Skript ohne Paginierungscode, um zu sehen, wie die Datensätze angezeigt werden. Zweitens: Hinzufügen von Seitennavigationscode zur PHP-Datei, um zu verstehen, wie Paginierung praktisch funktioniert.

Der PHP-Code erfordert einen MySQL-Benutzer für Authentifizierungszwecke und eine Beispieldatenbank für die Verbindung. In diesem Schritt erstellen Sie einen Benutzer ohne Rootberechtigung für Ihre MySQL-Datenbank, eine Beispieldatenbank und eine Tabelle zum Testen des PHP-Skripts.

Um zu beginnen, melden Sie sich bei Ihrem Server an. Melden Sie sich dann mit dem folgenden Befehl bei Ihrem MySQL-Server an:

sudo mysql -u root -p

Geben Sie dasroot-Kennwort Ihres MySQL-Servers ein und drücken SieENTER, um fortzufahren. Dann wird die MySQL-Eingabeaufforderung angezeigt. Führen Sie den folgenden Befehl aus, um eine Beispieldatenbank zu erstellen, die wir in diesem Lernprogrammtest_db nennen werden:

Create database test_db;

Sie werden die folgende Ausgabe sehen:

OutputQuery OK, 1 row affected (0.00 sec)

Erstellen Sie dann eintest_user und gewähren Sie dem Benutzer alle Berechtigungen fürtest_db. Ersetzen SiePASSWORD durch einen starken Wert:

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

Laden Sie die MySQL-Berechtigungen neu mit:

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

Wechseln Sie als Nächstes zur Datenbanktest_db, um direkt an der Datenbanktest_dbzu arbeiten:

Use test_db;
OutputDatabase changed

Erstellen Sie nun eineproducts-Tabelle. Die Tabelle enthält Ihre Beispielprodukte. Für dieses Lernprogramm sind nur zwei Spalten für die Daten erforderlich. Die Spalteproduct_id dient als Primärschlüssel, um jeden Datensatz eindeutig zu identifizieren. Sie verwenden das Feldproduct_name, um jedes Element nach seinem Namen zu unterscheiden:

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

Führen Sie die folgenden SQL-Anweisungen aus, um der Tabelleproductszehn Testprodukte hinzuzufügen:

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

Sie sehen diese Ausgabe:

OutputQuery OK, 1 row affected (0.02 sec)

Stellen Sie sicher, dass die Produkte in die Tabelle eingefügt wurden, indem Sie Folgendes ausführen:

select * from products;

Sie sehen die Produkte in Ihrer Ausgabe in den beiden Spalten:

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)

Beenden Sie MySQL:

quit;

Mit den vorhandenen Beispieldatenbank-, Tabellen- und Testdaten können Sie jetzt ein PHP-Skript erstellen, um Daten auf einer Webseite anzuzeigen.

[[Schritt-2 - Anzeigen von MySQL-Datensätzen ohne Paginierung]] == Schritt 2 - Anzeigen von MySQL-Datensätzen ohne Paginierung

Jetzt erstellen Sie ein PHP-Skript, das eine Verbindung zu der im vorherigen Schritt erstellten MySQL-Datenbank herstellt, und listen die Produkte in einem Webbrowser auf. In diesem Schritt wird Ihr PHP-Code ohne jegliche Paginierung ausgeführt, um zu demonstrieren, wie nicht aufgeteilte Datensätze auf einer einzelnen Seite angezeigt werden. Obwohl Sie in diesem Lernprogramm nur zehn Datensätze zu Testzwecken haben, wird anhand der Datensätze ohne Paginierung deutlich, warum das Segmentieren von Daten letztendlich zu einer besseren Benutzererfahrung führt und den Server weniger belastet.

Erstellen Sie die PHP-Skriptdatei im Dokumentstamm Ihrer Website mit dem folgenden Befehl:

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

Fügen Sie der Datei dann den folgenden Inhalt hinzu. Denken Sie daran,PASSWORD durch den korrekten Wert des Kennworts zu ersetzen, das Sietest_user im vorherigen Schritt zugewiesen haben:

/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(); } ?>

Speichern Sie die Datei, indem SieCTRL+X,Y undENTER drücken.

In diesem Skript stellen Sie mithilfe derPDO (PHP Data Object)-Bibliothek mit den in Schritt 1 erstellten Datenbankanmeldeinformationen eine Verbindung zur MySQL-Datenbank her.

PDO ist eine leichte Schnittstelle zum Verbinden mit Datenbanken. Die Datenzugriffsebene ist portabler und kann mit nur geringfügigen Codeumschreibungen auf verschiedenen Datenbanken arbeiten. PDO bietet eine höhere Sicherheit, da esprepared statements unterstützt - eine Funktion, mit der Abfragen auf sichere Weise schneller ausgeführt werden können.

Anschließend weisen Sie die PDO-API an, die Anweisungselect * from productsauszuführen und Produkte in einer HTML-Tabelle ohne Paginierung aufzulisten. Die Zeile$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); stellt sicher, dass die Datentypen so zurückgegeben werden, wie sie in der Datenbank angezeigt werden. Dies bedeutet, dass PDO dieproduct_id als Ganzzahl und dieproduct_name als Zeichenfolge zurückgibt. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); weist PDO an, eine Ausnahme auszulösen, wenn ein Fehler auftritt. Zum einfacheren Debuggen wird der Fehler im PHPtry{}...catch{}-Block abgefangen.

Besuchen Sie die folgende URL, um/var/www/html/pagination_test.php PHP-Skriptdatei auszuführen, die Sie erstellt haben, und ersetzen Sieyour-server-IP durch die öffentliche IP-Adresse Ihres Servers:

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

Sie sehen eine Seite mit einer Tabelle Ihrer Produkte.

MySQL Records Displayed with a PHP script - No Pagination

Ihr PHP-Skript funktioniert wie erwartet. Auflistung aller Produkte auf einer Seite. Wenn Sie Tausende von Produkten hätten, würde dies zu einer langen Schleife führen, da die Produkte aus der Datenbank abgerufen und auf der PHP-Seite gerendert werden.

Um diese Einschränkung zu überwinden, ändern Sie das PHP-Skript und fügen die MySQLLIMIT-Klausel und einige Navigationslinks am Ende der Tabelle hinzu, um Paginierungsfunktionen hinzuzufügen.

[[Schritt-3 - Implementierung der Paginierung mit PHP]] == Schritt 3 - Implementierung der Paginierung mit PHP

In diesem Schritt besteht Ihr Ziel darin, die Testdaten in mehrere und verwaltbare Seiten aufzuteilen. Dies verbessert nicht nur die Lesbarkeit, sondern nutzt auch die Ressourcen des Servers effizienter. Sie ändern das PHP-Skript, das Sie im vorherigen Schritt erstellt haben, um der Paginierung Rechnung zu tragen.

Dazu implementieren Sie die Klausel MySQLLIMIT. Bevor Sie dies zum Skript hinzufügen, sehen wir uns ein Beispiel für die Syntax von MySQLLIMITan:

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

DieLIMIT-Klausel akzeptiert zwei Argumente, wie gegen Ende dieser Anweisung gezeigt. Der Wert vonoffsetist die Anzahl der Datensätze, die vor der ersten Zeile übersprungen werden sollen. records legt die maximale Anzahl von Datensätzen fest, die pro Seite angezeigt werden sollen.

Um die Paginierung zu testen, werden drei Datensätze pro Seite angezeigt. Um die Gesamtzahl der Seiten zu erhalten, müssen Sie die Gesamtzahl der Datensätze aus Ihrer Tabelle durch die Zeilen teilen, die pro Seite angezeigt werden sollen. Anschließend runden Sie den resultierenden Wert mit der Funktion von PHPCeilauf die nächste Ganzzahl, wie im folgenden PHP-Code-Snippet-Beispiel gezeigt:

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

Es folgt die geänderte Version des PHP-Skripts mit dem vollständigen Paginierungscode. Öffnen Sie die Datei/var/www/html/pagination_test.php, um die Paginierungs- und Navigationscodes einzuschließen:

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

Fügen Sie Ihrer Datei dann den folgenden hervorgehobenen Code hinzu:

/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(); } ?>

In Ihrer Datei haben Sie zusätzliche Parameter verwendet, um das Paging auszuführen:

  • $page: Diese Variable enthält die aktuelle Seite in Ihrem Skript. Beim Wechseln zwischen den Seiten ruft Ihr Skript einen URL-Parameter mit dem Namenpage mithilfe der Variablen$_GET['page'] ab.

  • $per_page: Diese Variable enthält die maximalen Datensätze, die pro Seite angezeigt werden sollen. In Ihrem Fall möchten Sie auf jeder Seite drei Produkte auflisten.

  • $total_records: Bevor Sie die Produkte auflisten, führen Sie eine SQL-Anweisung aus, um die Gesamtzahl der Datensätze in Ihrer Zieltabelle abzurufen und sie der Variablen$total_records zuzuweisen.

  • $offset: Diese Variable repräsentiert die Gesamtzahl der Datensätze, die vor der ersten Zeile übersprungen werden sollen. Dieser Wert wird dynamisch von Ihrem PHP-Skript unter Verwendung der Formel$offset=($page-1)*$per_page berechnet. Sie können diese Formel an Ihre PHP-Paginierungsprojekte anpassen. Denken Sie daran, dass Sie die Variable$per_pagean Ihre Bedürfnisse anpassen können. Sie können ihn beispielsweise auf einen Wert von50 ändern, um fünfzig Elemente pro Seite anzuzeigen, wenn Sie eine Website oder einen anderen Betrag für ein mobiles Gerät ausführen.

Besuchen Sie erneut Ihre IP-Adresse in einem Browser und ersetzen Sieyour_server_ip durch die öffentliche IP-Adresse Ihres Servers:

http://your_server_ip/pagination_test.php

Unten auf der Seite werden nun einige Navigationsschaltflächen angezeigt. Auf der ersten Seite erhalten Sie keinePrevious-Schaltfläche. Der gleiche Fall tritt auf der letzten Seite auf, auf der Sie die SeitenschaltflächeNextnicht erhalten. Beachten Sie außerdem, wie sich der URL-Parameter vonpagebeim Besuch jeder Seite ändert.

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

Die Navigationslinks am Ende der Seite werden mit dem folgenden PHP-Code-Snippet aus Ihrer Datei erstellt:

/var/www/html/pagination_test.php

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

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

Hier repräsentiert die Variable$page die aktuelle Seitenzahl. Um die vorherige Seite zu erhalten, wird der Code minus1 von der Variablen entfernt. Wenn Sie sich also auf Seite 2 befinden, erhalten Sie mit der Formel(2-1) ein Ergebnis von1. Dies ist die vorherige Seite, die im Link angezeigt wird. Beachten Sie jedoch, dass die vorherige Seite nur angezeigt wird, wenn ein Ergebnis größer oder gleich1 vorliegt.

Um zur nächsten Seite zu gelangen, fügen Sie der Variablen$page eine hinzu, und Sie müssen sicherstellen, dass das Ergebnis von$page, das wir an den URL-Parameterpageanhängen, nicht größer als ist die Gesamtseiten, die Sie in Ihrem PHP-Code berechnet haben.

Zu diesem Zeitpunkt arbeitet Ihr PHP-Skript mit Paginierung und Sie können die MySQLLIMIT-Klausel für eine bessere Datensatznavigation implementieren.

Fazit

In diesem Tutorial haben Sie Paging in MySQL mit PHP auf einem Ubuntu 18.04-Server implementiert. Sie können diese Schritte mit einem größeren Recordset ausführen, indem Sie das PHP-Skript verwenden, um die Paginierung einzuschließen. Durch die Verwendung von Paginierung auf Ihrer Website oder Anwendung können Sie eine bessere Benutzernavigation und eine optimale Ressourcennutzung auf Ihrem Server erzielen.

Ab hier können Sie mit diesen Lernprogrammen weitere Optimierungen für Ihre Datenbank und andere Datenbankaufgaben in Betracht ziehen: